我们已经创建了一个自签名CA证书,我们使用该证书对其他证书进行签名以实现SSL目的。这些证书将安装在我们无法访问的其他服务器上,并将严格用于与其他客户端(如移动的应用程序)进行通信。
当这些客户端(用.NET编写)使用HTTPS向服务器发出请求时,我们会收到“Invalid certificate received from server”(从服务器收到的证书无效)错误,因为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证书创建的,因此它是有效的,其他任何东西都是假的!
我的假设正确吗?
4条答案
按热度按时间clj7thdc1#
我不完全确定这是你要找的东西,但它可能会把你推向正确的方向。下面是一个PowerShell脚本,我用它来查找我刚刚创建的证书,并使用MAKECERT. EXE和CERTMGR.EXE提取:
1cklez4t2#
这是一个错误的解决方案。您应该在所有客户端中安装自签名证书作为受信任的CA证书,或者更好的方法是让它由一个已经受信任的CA签名。不要为此编写代码。
vpfxa7rd3#
根据以下答案,一个可能的解决方案是您可以通过电子邮件发送证书:https://stackoverflow.com/a/4473799/674700。
camsedfj4#
这里有一些信息链接和一些工具来生成免费的公钥和私钥:
https://www.igolder.com/pgp/
https://www.igolder.com/pgp/generate-key/
我认为EJP的解决方案是最容易被接受的。@EJP,你能给予我们一些可以帮助我们成为“微型CA”的应用程序的例子吗?