验证 Azure Stack Hub PKI 证书

从 PowerShell 库获取本文所述的 Azure Stack Hub 就绪性检查器工具。 使用该工具可以验证生成的公钥基础结构 (PKI) 证书是否适用于前期部署。 留出足够的测试时间来验证证书,并在必要时重新颁发证书。

就绪性检查器工具执行以下证书验证:

  • 分析 PFX
    检查 PFX 文件是否有效且密码正确,以及公开的信息是否受密码保护。
  • 到期日期
    检查最短有效期是否为 7 天。
  • 签名算法
    检查签名算法是否不是 SHA1。
  • 私钥
    检查私钥是否存在,并且已连同“本地计算机”属性一起导出。
  • 证书链
    检查证书链是否完整,包括自签名证书。
  • DNS 名称
    检查 SAN 是否包含每个终结点的相关 DNS 名称,或支持性的通配符是否存在。
  • 密钥用法
    检查密钥用法是否包含数字签名和密钥加密,并检查增强型密钥用法是否包含服务器身份验证和客户端身份验证。
  • 密钥大小
    检查密钥大小是否为 2048 或更大。
  • 链序
    检查其他证书的顺序,验证顺序是否正确。
  • 其他证书
    确保除了相关叶证书及其链以外,PFX 中未打包其他证书。

重要

PKI 证书是一个 PFX 文件,其密码应被视为敏感信息。

先决条件

在验证用于 Azure Stack Hub 部署的 PKI 证书之前,系统应符合以下先决条件:

  • Microsoft Azure Stack Hub 就绪情况检查程序。
  • 按照准备说明导出的 SSL 证书。
  • DeploymentData.json。
  • Windows 10 或 Windows Server 2016。

执行核心服务证书验证

使用以下步骤来验证用于部署和机密轮换的 Azure Stack Hub PKI 证书:

  1. 在 PowerShell 提示符(5.1 或更高版本)下,运行以下 cmdlet 安装 AzsReadinessChecker

    Install-Module Microsoft.AzureStack.ReadinessChecker -Force -AllowPrerelease
    
  2. 创建证书目录结构。 在以下示例中,可将 <C:\Certificates\Deployment> 更改为所选的新目录路径。

    New-Item C:\Certificates\Deployment -ItemType Directory
    
    $directories = 'ACSBlob', 'ACSQueue', 'ACSTable', 'Admin Extension Host', 'Admin Portal', 'ARM Admin', 'ARM Public', 'KeyVault', 'KeyVaultInternal', 'Public Extension Host', 'Public Portal'
    
    $destination = 'C:\Certificates\Deployment'
    
    $directories | % { New-Item -Path (Join-Path $destination $PSITEM) -ItemType Directory -Force}
    

    注意

    如果使用 AD FS 作为标识系统,则需要 AD FS 和 Graph。 例如:

    $directories = 'ACSBlob', 'ACSQueue', 'ACSTable', 'ADFS', 'Admin Extension Host', 'Admin Portal', 'ARM Admin', 'ARM Public', 'Graph', 'KeyVault', 'KeyVaultInternal', 'Public Extension Host', 'Public Portal'
    
    • 将证书放入上一步骤中创建的相应目录。 例如:
      • C:\Certificates\Deployment\ACSBlob\CustomerCertificate.pfx
      • C:\Certificates\Deployment\Admin Portal\CustomerCertificate.pfx
      • C:\Certificates\Deployment\ARM Admin\CustomerCertificate.pfx
  3. 在 PowerShell 窗口中,更改 RegionNameFQDNIdentitySystem 的值使其适合 Azure Stack Hub 环境,然后运行以下 cmdlet:

    $pfxPassword = Read-Host -Prompt "Enter PFX Password" -AsSecureString 
    Invoke-AzsHubDeploymentCertificateValidation -CertificatePath C:\Certificates\Deployment -pfxPassword $pfxPassword -RegionName east -FQDN azurestack.contoso.com -IdentitySystem AAD  
    
  4. 检查输出,确保所有证书通过所有测试。 例如:

    Invoke-AzsHubDeploymentCertificateValidation v1.2005.1286.272 started.
    Testing: KeyVaultInternal\KeyVaultInternal.pfx
    Thumbprint: E86699****************************4617D6
        PFX Encryption: OK
        Expiry Date: OK
        Signature Algorithm: OK
        DNS Names: OK
        Key Usage: OK
        Key Length: OK
        Parse PFX: OK
        Private Key: OK
        Cert Chain: OK
        Chain Order: OK
        Other Certificates: OK
    Testing: ARM Public\ARMPublic.pfx
    Thumbprint: 8DC4D9****************************69DBAA
        PFX Encryption: OK
        Expiry Date: OK
        Signature Algorithm: OK
        DNS Names: OK
        Key Usage: OK
        Key Length: OK
        Parse PFX: OK
        Private Key: OK
        Cert Chain: OK
        Chain Order: OK
        Other Certificates: OK
    Testing: Admin Portal\AdminPortal.pfx
    Thumbprint: 6F9055****************************4AC0EA
        PFX Encryption: OK
        Expiry Date: OK
        Signature Algorithm: OK
        DNS Names: OK
        Key Usage: OK
        Key Length: OK
        Parse PFX: OK
        Private Key: OK
        Cert Chain: OK
        Chain Order: OK
        Other Certificates: OK
    Testing: Public Portal\PublicPortal.pfx
    
    
    Log location (contains PII): C:\Users\[*redacted*]\AppData\Local\Temp\AzsReadinessChecker\AzsReadinessChecker.log
    Report location (contains PII): C:\Users\[*redacted*]\AppData\Local\Temp\AzsReadinessChecker\AzsReadinessCheckerReport.json
    Invoke-AzsHubDeploymentCertificateValidation Completed
    

    若要验证其他 Azure Stack Hub 服务的证书,请更改 -CertificatePath 的值。 例如:

    # App Services
    Invoke-AzsHubAppServicesCertificateValidation -CertificatePath C:\Certificates\AppServices -pfxPassword $pfxPassword -RegionName east -FQDN azurestack.contoso.com
    
    # DBAdapter
    Invoke-AzsHubDBAdapterCertificateValidation -CertificatePath C:\Certificates\DBAdapter -pfxPassword $pfxPassword -RegionName east -FQDN azurestack.contoso.com
    
    # EventHubs
    Invoke-AzsHubEventHubsCertificateValidation -CertificatePath C:\Certificates\EventHubs -pfxPassword $pfxPassword -RegionName east -FQDN azurestack.contoso.com
    

    每个文件夹应包含一个与证书类型对应的 PFX 文件。 如果某个证书类型具有多证书要求,则预期每个证书都有一个嵌套的文件夹,这些文件夹的名称区分大小写。 以下代码显示了所有证书类型的示例文件夹/证书结构,以及 的 -CertificatePath相应值。

    C:\>tree c:\SecretStore /A /F
        Folder PATH listing
        Volume serial number is 85AE-DF2E
        C:\SECRETSTORE
        \---AzureStack
            +---CertificateRequests
            \---Certificates
                +---AppServices         # Invoke-AzsCertificateValidation `
                |   +---API             # -CertificatePath C:\Certificates\AppServices
                |   |       api.pfx     
                |   |
                |   +---DefaultDomain
                |   |       wappsvc.pfx
                |   |
                |   +---Identity
                |   |       sso.pfx
                |   |
                |   \---Publishing
                |           ftp.pfx
                |
                +---DBAdapter           # Invoke-AzsCertificateValidation `
                |       dbadapter.pfx   # -CertificatePath C:\Certificates\DBAdapter
                |                       
                |
                +---Deployment          # Invoke-AzsCertificateValidation `
                |   +---ACSBlob         # -CertificatePath C:\Certificates\Deployment
                |   |       acsblob.pfx 
                |   |
                |   +---ACSQueue
                |   |       acsqueue.pfx
               ./. ./. ./. ./. ./. ./. ./.    <- Deployment certificate tree trimmed.
                |   \---Public Portal
                |           portal.pfx
                |
                \---EventHubs           # Invoke-AzsCertificateValidation `
                        eventhubs.pfx   # -CertificatePath C:\Certificates\EventHubs
    
    

已知问题

症状:跳过了测试

原因: 如果不符合依赖关系,AzsReadinessChecker 会跳过某些测试:

  • 如果证书链出错,则会跳过其他证书。

    Testing: ACSBlob\singlewildcard.pfx
         Read PFX: OK
         Signature Algorithm: OK
         Private Key: OK
         Cert Chain: OK
         DNS Names: Fail
         Key Usage: OK
         Key Size: OK
         Chain Order: OK
         Other Certificates: Skipped
    Details:
    The certificate records '*.east.azurestack.contoso.com' do not contain a record that is valid for '*.blob.east.azurestack.contoso.com'. Please refer to the documentation for how to create the required certificate file.
    The other certificates check was skipped because cert chain and/or DNS names failed. Follow the guidance to remediate those issues and recheck. 
    
    Log location (contains PII): C:\Users\username\AppData\Local\Temp\AzsReadinessChecker\AzsReadinessChecker.log
    Report location (contains PII): C:\Users\username\AppData\Local\Temp\AzsReadinessChecker\AzsReadinessCheckerReport.json
    Invoke-AzsCertificateValidation Completed
    

解决方法:遵循针对每个证书的每组测试下的详细信息部分中的工具指导。

症状:尽管 HTTP CDP 已写入 x509 扩展,但 HTTP CRL 检查失败。

原因:目前,AzsReadinessChecker 无法在某些语言中检查 HTTP CDP。

解决方法:将 OS 语言设置为 EN-US,然后运行验证。

证书

Directory 证书
ACSBlob wildcard_blob_<region>_<externalFQDN>
ACSQueue wildcard_queue_<region>_<externalFQDN>
ACSTable wildcard_table_<region>_<externalFQDN>
管理扩展主机 wildcard_adminhosting_<region>_<externalFQDN>
管理门户 adminportal_<region>_<externalFQDN>
ARM Admin adminmanagement_<region>_<externalFQDN>
ARM Public management_<region>_<externalFQDN>
KeyVault wildcard_vault_<region>_<externalFQDN>
KeyVaultInternal wildcard_adminvault_<region>_<externalFQDN>
公共扩展主机 wildcard_hosting_<region>_<externalFQDN>
公共门户 portal_<region>_<externalFQDN>

后续步骤

AzsReadinessChecker 验证证书后,便可在 Azure Stack Hub 部署中使用这些证书,或者将其用于部署后的机密轮换。