【发布时间】:2013-01-16 00:47:22
【问题描述】:
我们创建了一个自签名 CA 证书,用于签署其他证书以用于 SSL 目的。这些证书将安装在我们无权访问的其他服务器中,并将严格用于与移动应用程序等其他客户端进行通信。
当这些客户端(用 .NET 编写)使用 HTTPS 向服务器发出请求时,我们会收到“从服务器接收到的证书无效”错误,因为 CA 证书不是该客户端上的受信任 CA。
我们希望使用 ServicePointManager.ServerCertificateValidationCallback 绕过此安全性,但前提是所使用的证书由我们的 CA 证书签名。
我可以查看certificate.Issuer,但这很容易被任何人欺骗。如何获取无效证书的颁发者证书的指纹或公钥?如果我可以访问它,我可以轻松地将其与我知道的有效证书进行比较,并忽略证书错误并继续请求。
更新
我想我越来越近了。看起来我们想要做的事情是不可行的,所以方向略有不同。
使用X509Chain,我们可以使用下面的代码验证证书是否是CA的孩子:
var caCert = new X509Certificate2(@"[path]\MyCA.cer");
var newChain = new X509Chain();
newChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
newChain.ChainPolicy.ExtraStore.Add(caCert);
var res = newChain.Build(certInQuestion);
Build() 仍然返回 false(正如预期的那样,因为 CA 在客户端上不受信任),但现在 newChain.ChainStatus[0].Status 正在返回 UntrustedRoot。根据我的测试,这意味着链经过验证,因为如果我提供不同的 CA 证书,它会失败并显示 InvalidChain。
总之,这告诉我如果状态是UntrustedRoot,则证书是使用我们的 CA 证书创建的,因此它是有效的,否则它是假的!
我的假设正确吗?
【问题讨论】:
-
如果我有颁发者的公钥,也许我可以根据该密钥来验证证书?
标签: c# .net ssl ssl-certificate