我们创建了一个自签名 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
.
总之,这告诉我,如果 Status 是UntrustedRoot
,则证书是使用我们的 CA 证书创建的,因此它是有效的,否则它是假的!
我的假设正确吗?