10

我们创建了一个自签名 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 证书创建的,因此它是有效的,否则它是假的!

我的假设正确吗?

4

4 回答 4

0

我不完全确定这就是您正在寻找的东西,但它可能会将您推向正确的方向。这是我用来查找刚刚使用 MAKECERT.EXE 和 CERTMGR.EXE 创建和提取的证书的 PowerShell 脚本:

# get certificate thumbprint
$appCertificate = Get-PfxCertificate -FilePath $certificateFullPath

Write-Host "  .. adding certificate to local machine root" -ForegroundColor Gray 
& $ExeCertManager /add $certificateFullPath /s /r localMachine root
Write-Host "  Certificate installed on local machine" -ForegroundColor Gray 

Write-Host "  .. exporting private key for certificate" -ForegroundColor Gray 
Get-ChildItem cert:\\localmachine\my | Where-Object {$_.Thumbprint -eq $appCertificate.Thumbprint} | ForEach-Object {
    $CertPfxName = (Get-Item -Path $certificateFullPath).BaseName
}
于 2013-01-31T20:16:27.300 回答
0

那是错误的解决方案。您应该在所有客户端中将您的自签名证书安装为受信任的 CA 证书,或者最好还是让已受信任的 CA 对其进行签名。不要为此编写代码。

于 2013-01-31T22:42:56.050 回答
0

以下是一些信息链接和一些生成免费公钥和私钥的工具:

https://www.igolder.com/pgp/

https://www.igolder.com/pgp/generate-key/

我认为 EJP 的解决方案是最能接受的。@EJP,您能否给我们一些可以帮助我们成为“微型 CA”的应用程序示例。

于 2013-02-19T20:00:15.020 回答
0

根据以下答案,似乎一个可能的解决方案是您可以通过电子邮件发送证书:https ://stackoverflow.com/a/4473799/674700 。

于 2013-01-31T23:07:58.387 回答