ssl 如何取得签发者凭证的指模或公开密钥?

8ehkhllq  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(144)

我们已经创建了一个自签名CA证书,我们使用该证书对其他证书进行签名以实现SSL目的。这些证书将安装在我们无法访问的其他服务器上,并将严格用于与其他客户端(如移动的应用程序)进行通信。
当这些客户端(用.NET编写)使用HTTPS向服务器发出请求时,我们会收到“Invalid certificate received from server”(从服务器收到的证书无效)错误,因为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证书创建的,因此它是有效的,其他任何东西都是假的!
我的假设正确吗?

clj7thdc

clj7thdc1#

我不完全确定这是你要找的东西,但它可能会把你推向正确的方向。下面是一个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
}
1cklez4t

1cklez4t2#

这是一个错误的解决方案。您应该在所有客户端中安装自签名证书作为受信任的CA证书,或者更好的方法是让它由一个已经受信任的CA签名。不要为此编写代码。

vpfxa7rd

vpfxa7rd3#

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

camsedfj

camsedfj4#

这里有一些信息链接和一些工具来生成免费的公钥和私钥:
https://www.igolder.com/pgp/
https://www.igolder.com/pgp/generate-key/
我认为EJP的解决方案是最容易被接受的。@EJP,你能给予我们一些可以帮助我们成为“微型CA”的应用程序的例子吗?

相关问题