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

Posted

技术标签:

【中文标题】如何获取颁发者证书的指纹或公钥?【英文标题】:How to get Thumbprint or Public Key of Issuer Certificate? 【发布时间】:2013-01-16 00:47:22 【问题描述】:

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

我的假设正确吗?

【问题讨论】:

如果我有颁发者的公钥,也许我可以根据该密钥来验证证书? 【参考方案1】:

我不完全确定这就是您正在寻找的东西,但它可能会将您推向正确的方向。这是一个 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

【讨论】:

谢谢 Andrew,但我正在尝试在移动应用程序中以编程方式验证证书颁发者的公钥或指纹。【参考方案2】:

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

【讨论】:

在所有客户端中安装 CA 证书是不可管理的。我希望能够由受信任的 CA 签署它,但是对于我们为什么要这样做的商业决策。 一个非常糟糕的商业决策。审查它。签名将花费您 50 美元,大约需要 24 小时,并且可以立即、正确、安全地工作。编写代码并对其进行测试等将花费数千美元,需要几天甚至几周的时间,并且会带来您甚至无法量化的安全风险。 它不是一个单一的证书。这些证书安装在客户的服务器上,因此它是每个客户的证书。业务决策是使服务器的安装尽可能简单,并且每年都通过获得 SSL 证书的过程不是他们希望客户经历的选择。 除非你能告诉我有一种方法可以通过受信任的 CA 颁发的证书在内部创建 SSL 证书... @JonasStawski 你需要成为一个“小 CA”,拥有自己的证书。有很多工具可供下载。【参考方案3】:

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

【讨论】:

是的,我知道我可以安装 CA 证书,但此时我宁愿远离它。移动客户端现在是 ios,以后会是 android 和 WP。【参考方案4】:

这里有一些信息链接和一些生成免费公钥和私钥的工具:

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

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

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

【讨论】:

TinyCA 是一(因此得名)。 XCA 是另一个(也是跨平台的)。 谢谢,我正在寻找那种工具...!

以上是关于如何获取颁发者证书的指纹或公钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中获取证书颁发者信息?

如何在本地使用 wamp 时摆脱 payum“SSL 证书问题:无法获取本地颁发者证书”错误

APNS,当程序在 Mac 上运行时,如何修复树莓派上的“无法获取本地颁发者证书”错误?

如何从trust.p12证书文件中获取SSL证书主题,颁发者,开始日期和过期日期

无法连接到 APNS:返回代码 20(无法获取本地颁发者证书)

newman CLI在teamcity构建中返回“错误:无法获取本地颁发者证书”