1

我们有一个 .Net 应用程序,它连接到我们托管的服务器上的 Web 服务,并且我们在这些服务器上绑定到 https/443 的 SSL 证书。有时这些 SSL 证书是自签名的,因此我们并不完全依赖 X509Certificate2.Verify() 方法和我们为 ServicePointManager.ServerCertificateValidationCallback 编程的方法中的 SslPolicyErrors.None 枚举,因为我们的证书并不总是有效的。

我们有一个第二步,检查哈希字符串的签名 (X509Certificate.GetCertHashString()) 并将其与“已批准”证书列表进行比较。这样,如果它是一个已知的证书,我们可以为回调返回一个 true。

在我们的一个安装站点中,当连接到完全相同的 Web 服务器时,我们会得到一个不同的哈希字符串。在将 X509Certificate 对象上的每个属性打印到日志文件后,我发现它们连接时的“颁发者”值不同。从他们用户的工作站到他们的网络硬件,再到我们的服务器,一路上都有一些东西正在修改证书。当我们的应用程序验证证书时,首先它不再是受信任的机构,其次当它检查哈希字符串时,它不在批准列表中(更改颁发者似乎会更改哈希)。

任何人都可以提供有关他们如何做到这一点的任何想法吗?此外,任何想法如何在.Net中以编程方式做到这一点?

谢谢,丹

4

2 回答 2

2

有问题的连接是否有可能被处于 SSL 会话中间的企业代理(如bluecoatwebsense )拦截?

于 2012-07-02T21:21:08.180 回答
0

更改证书会破坏其签名,并且当您的验证表明某些内容会更改证书时,您应该查看更改证书的内容,而不是“如何”完成。

更改很简单 - 由于证书是自签名的,因此某人可以使用自己的密钥对创建另一个自签名证书,并将不同的主题或颁发者放入证书。没有大碍。目标显然是通过安装中间人代理来捕获和解码流量。

于 2012-07-02T16:39:44.177 回答