如何获取证书颁发者指纹?

How to obtain certificate issuer thumbprint?

我目前正在尝试使用提供的说明部署 Service Fabric 集群 here. I've successfully created a certificate using Let's Encrypt and am able to successfully handle all the instructions except for obtaining the certificateIssuerThumbprint value, as indicated as required in the parameters file at the top of this link

查看我的证书管理器中的证书详细信息,我没有看到提供此值的字段。我通读了 Let's Encrypt 的 Chain of Trust 页面,我希望在该页面上找到这样的值,但我没有看到它。

我将如何查找此证书颁发者指纹值是多少?

谢谢!

使用您提供的 link 中的脚本将其上传到 Keyvault 后,您应该能够看到该值

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-create-cluster-using-cert-cn#upload-the-certificate-to-a-key-vault

    Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force

$SubscriptionId  =  "<subscription ID>"

# Sign in to your Azure account and select your subscription
Login-AzAccount -SubscriptionId $SubscriptionId

$region = "southcentralus"
$KeyVaultResourceGroupName  = "mykeyvaultgroup"
$VaultName = "mykeyvault"
$certFilename = "C:\users\sfuser\myclustercert.pfx"
$certname = "myclustercert"
$Password  = "P@ssw0rd!123"

# Create new Resource Group 
New-AzResourceGroup -Name $KeyVaultResourceGroupName -Location $region

# Create the new key vault
$newKeyVault = New-AzKeyVault -VaultName $VaultName -ResourceGroupName $KeyVaultResourceGroupName -Location $region -EnabledForDeployment 
$resourceId = $newKeyVault.ResourceId 

# Add the certificate to the key vault.
$PasswordSec = ConvertTo-SecureString -String $Password -AsPlainText -Force
$KVSecret = Import-AzureKeyVaultCertificate -VaultName $vaultName -Name $certName  -FilePath $certFilename -Password $PasswordSec

$CertificateThumbprint = $KVSecret.Thumbprint
$CertificateURL = $KVSecret.SecretId
$SourceVault = $resourceId
$CommName    = $KVSecret.Certificate.SubjectName.Name

Write-Host "CertificateThumbprint    :"  $CertificateThumbprint
Write-Host "CertificateURL           :"  $CertificateURL
Write-Host "SourceVault              :"  $SourceVault
Write-Host "Common Name              :"  $CommName

我远不是证书方面的专家,但这是我认为需要做的事情:

  • 在证书管理器中,如果您只需双击并打开证书 > 证书路径选项卡,您应该会在底部看到您的证书(作为叶节点),并且在详细信息选项卡中您会看到您的证书指纹
  • 您的证书上方应该有一个证书 - 我相信这是颁发者证​​书。如果您双击该颁发者证书 > 详细信息,我认为这就是您需要的指纹

来自Create an SF cluster using certificates declared by CN

"备注

'certificateIssuerThumbprint' 字段允许指定具有给定主题通用名称的预期证书颁发者。此字段接受以逗号分隔的 SHA1 指纹枚举。请注意,这是对证书验证的加强——在未指定颁发者或为空的情况下,如果可以构建证书链,证书将被接受进行身份验证,并最终在验证者信任的根中。如果指定了颁发者,则如果其直接颁发者的指纹与此字段中指定的任何值匹配,则证书将被接受 - 无论根是否受信任。请注意,PKI 可能使用不同的证书颁发机构为同一主题颁发证书,因此为给定主题指定所有预期的颁发者指纹非常重要。

指定颁发者被认为是最佳做法;虽然省略它将继续工作——对于链接到受信任根的证书——这种行为有局限性,可能会在不久的将来被淘汰。另请注意,如果 PKI 的证书策略不可发现、可用和可访问。"

请注意,在更新(或重新键入)证书时,颁发者可能会发生变化。 PKI 通常会在证书实践声明 (CPS) 中发布其所有活跃的颁发者(here 是 LetsEncrypt 的 - 不幸的是它似乎没有列出颁发者证书。)

如果您是 Microsoft 内部人员,您可能会知道使用哪个 API 来检索授权颁发者;如果不是,请联系您选择的 PKI 以获得指导。

$secret = Get-AzKeyVaultSecret -VaultName $vault -SecretName $secretName -Version $version
$certBytes = [Convert]::FromBase64String($secret.SecretValueText)
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certBytes, $null, 'Exportable')

$certChain = [System.Security.Cryptography.X509Certificates.X509Chain]::new()
$certChain.Build($cert)

$certificateIssuerThumbprint = ($certChain.ChainElements.Certificate | Where-Object {$_.Subject -eq $cert.Issuer}).Thumbprint

如果证书保存在 Azure Key Vault 中,@mperian 的回答绝对准确。

在我的例子中,证书被安装到不同机器上的商店中。基于他们出色的回答,这里的 Powershell 可以在不使用 Azure Key Vault 的情况下在本地执行相同的操作。

$thumbprint = ""
$store = "My"

$cert = Get-ChildItem -Path "Cert:\LocalMachine$store" | Where-Object {$_.Thumbprint -match $thumbprint}
$certChain = [System.Security.Cryptography.X509Certificates.X509Chain]::new()
$certChain.Build($cert)
$certIssuerThumbprint = ($certChain.ChainElements.Certificate | Where-Object {$_.Subject -eq $cert.Issuer}).Thumbprint