如何获得发行人证书的指纹或公钥?

Jon*_*ski 8 .net c# ssl ssl-certificate

我们创建了一个自签名CA证书,我们用它来签署其他证书以用于SSL.这些证书将安装在我们无法访问的其他服务器中,并且将严格与其他客户端(如移动应用程序)进行通信.

当这些客户端(用.NET编写)使用HTTPS向服务器发出请求时,我们会收到"从服务器收到的证书无效"错误,因为CA证书不是该客户端上的可信CA.

我们希望使用ServicePointManager.ServerCertificateValidationCallback,但仅当所使用的证书由我们的CA证书签名时才绕过此安全性.

我可以查看certificate.Issuer,但很容易被任何人欺骗.如何获取无效证书的颁发者证书的指纹或公钥?如果我可以访问它,我可以轻松地将它与我知道有效的那个进行比较,并忽略证书错误并继续请求.

UPDATE

我想我越来越近了.看起来我们要做的事情是不可行的,所以方向略有不同.

使用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);
Run Code Online (Sandbox Code Playgroud)

Build()仍然返回false(正如预期的那样,因为CA在客户端上不受信任),但现在newChain.ChainStatus[0].Status正在返回UntrustedRoot.根据我的测试,这意味着链验证,因为如果我提供不同的CA证书,它将失败InvalidChain.

总而言之,这告诉我,如果状态是UntrustedRoot,证书使用我们的CA证书创建的,因此它是有效的,其他任何东西都是假的!

我的假设是否正确?

And*_*ell -1

我不完全确定这就是您正在寻找的东西,但它可能会将您推向正确的方向。下面是我用来查找刚刚使用 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
}
Run Code Online (Sandbox Code Playgroud)