如何获取颁发者证书的指纹或公钥

本文关键字:证书 指纹 公钥 何获取 获取 | 更新日期: 2023-09-27 17:57:06

我们创建了一个自签名的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 证书创建的,因此它是有效的,其他任何东西都是假的!

我的假设正确吗?

如何获取颁发者证书的指纹或公钥

这是

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

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

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

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

我认为EJP的解决方案是最容易接受的。 @EJP,您能给我们一些可以帮助我们成为"小CA"的应用程序示例吗?

我不完全确定这是你要找的,但它可能会把你推向正确的方向。下面是一个PowerShell脚本,我用来查找我刚刚使用MAKECERT.EXE和CERTMGR.EXE创建和提取的证书:

# 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
}

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