【发布时间】:2012-06-18 17:05:19
【问题描述】:
我有一个使用 ssl 证书标识自己的服务器。证书是自签名的。
如果用户尝试更换服务器并将“假”证书添加到操作系统信任的证书列表中,我想确保该软件不会发送数据。
到目前为止,这是我想出的:
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
bool result = false;
if (sender is HttpWebRequest)
{
var wr = sender as HttpWebRequest;
if (wr.Address.Host == "<my host>")
{
if (cert == null)
{
return false;
}
if (cert.GetCertHashString() == "<certificate hash string>")
{
return true;
}
return false;
}
}
return result;
}
按照我对代码的理解,它会信任我的 my host 证书,但它不会受到用户主机替换的保护。
我希望软件仅在使用<certificate hash string> 标识自己的证书时接受my host,并且如果my host 提供其他证书,则必须拒绝连接。
我该怎么做?
【问题讨论】:
-
在我回答这个问题之前。生成两个证书。插入一个证书的哈希值,然后发送另一个证书。报告发生了什么。
-
我认为另一条评论已经说到点子上了,但仍然......在代码中包含证书哈希字符串听起来不是一个好主意。
-
试图保护什么?客户正在上传机密数据?如果您有不受信任的客户,那么如何阻止他们直接入侵数据?证书是否会被黑客入侵以获取其他用户稍后发送的数据?如果他们要破解证书,什么会阻止他们破解哈希码?
-
因为另一个是自签名的,直到我告诉软件它才会被接受,所以我用google.com尝试了这个东西,它被拒绝了。看来这段代码毕竟够用了
-
@KenBrittain 我打算在之后混淆代码,但如果你有更好的想法将证书哈希放在哪里,我愿意接受建议
标签: c# .net security ssl trust