[英]How to get Thumbprint or Public Key of Issuer Certificate?
我们创建了一个自签名 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 证书创建的,因此它是有效的,否则它是假的!
我的假设正确吗?
我不完全确定这就是您正在寻找的东西,但它可能会将您推向正确的方向。 这是我用来查找刚刚使用 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
}
那是错误的解决方案。 您应该在所有客户端中将您的自签名证书安装为受信任的 CA 证书,或者最好还是让已受信任的 CA 对其进行签名。 不要为此编写代码。
根据以下答案,似乎一个可能的解决方案是您可以通过电子邮件发送证书: https ://stackoverflow.com/a/4473799/674700。
以下是一些信息链接和一些生成免费公钥和私钥的工具:
https://www.igolder.com/pgp/generate-key/
我认为 EJP 的解决方案是最能接受的。 @EJP,您能否给我们一些可以帮助我们成为“微型 CA”的应用程序示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.