使用 PowerShell 为点到站点连接生成和导出证书

点到站点连接使用证书进行身份验证。 本文介绍如何在 Windows 10 或更高版本、Windows Server 2016 或更高版本上使用 PowerShell 创建自签名根证书并生成客户端证书。

用于生成证书的 PowerShell cmdlet 是操作系统的一部分,不能在其他版本的 Windows 上运行。 主机操作系统仅用于生成证书。 生成证书后,可以将它们上传或安装在任何受支持的客户端操作系统上。

如果没有满足操作系统要求的计算机,可以使用 MakeCert 生成证书。 使用任一方法生成的证书均可安装在支持的所有客户端操作系统上。

创建自签名根证书

使用 New-SelfSignedCertificate cmdlet 创建自签名根证书。 有关参数的其他信息,请参阅 New-SelfSignedCertificate

  1. 在运行 Windows 10 或更高版本或 Windows Server 2016 的计算机上,使用提升的权限打开 Windows PowerShell 控制台。

  2. 使用以下示例创建自签名根证书。 以下示例创建名为“P2SRootCert”、会自动安装在“Certificates-Current User\Personal\Certificates”中的自签名根证书。 打开“certmgr.msc” 或“管理用户证书” ,即可查看证书。

    运行以下示例并进行必要的修改。

    $cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature `
    -Subject "CN=P2SRootCert" -KeyExportPolicy Exportable `
    -HashAlgorithm sha256 -KeyLength 2048 `
    -CertStoreLocation "Cert:\CurrentUser\My" -KeyUsageProperty Sign -KeyUsage CertSign
    
  3. 使 PowerShell 控制台保持打开状态,并继续执行后续步骤以生成客户端证书。

生成客户端证书

在使用点到站点连接连接到 VNet 的每台客户端计算机上,必须安装客户端证书。 可以从自签名根证书生成客户端证书,导出并安装该客户端证书。 如果不安装客户端证书,身份验证会失败。

以下步骤引导完成从自签名根证书生成客户端证书的过程。 可以从相同根证书生成多个客户端证书。 使用以下步骤生成客户端证书时,客户端证书会自动安装在用于生成该证书的计算机上。 如果想要在另一台客户端计算机上安装客户端证书,可以导出该证书。

这些示例使用 New-SelfSignedCertificate cmdlet 生成有效期为一年的客户端证书。 有关参数的其他信息(例如为客户端证书设置其他有效期),请参阅 New-SelfSignedCertificate

示例 1 - PowerShell 控制台会话仍处于打开状态

如果创建自签名根证书之后没有关闭 PowerShell 控制台,请使用此示例。 此示例延续上一节的内容,并使用已声明的“$cert”变量。 如果创建自签名根证书后关闭了 PowerShell 控制台,或者要在新的 PowerShell 控制台会话中创建其他客户端证书,请使用示例 2 中的步骤。

修改并运行示例以生成客户端证书。 如果在未经修改的情况下直接运行以下示例,会生成名为“P2SChildCert”的客户端证书。 如果想要为子证书指定其他名称,请修改 CN 值。 运行此示例时,请不要更改 TextExtension。 生成的客户端证书会自动安装在计算机上的“Certificates - Current User\Personal\Certificates”中。

New-SelfSignedCertificate -Type Custom -DnsName P2SChildCert -KeySpec Signature `
-Subject "CN=P2SChildCert" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")

示例 2 - 新建 PowerShell 控制台会话

若要创建其他客户端证书,或者不想要使用创建自签名根证书时所用的同一个 PowerShell 会话,请使用以下步骤:

  1. 识别安装在计算机上的自签名根证书。 此 cmdlet 将返回计算机上安装的证书列表。

    Get-ChildItem -Path "Cert:\CurrentUser\My"
    
  2. 从返回的列表中找到使用者名称,然后将该名称旁边的指纹复制到文本文件中。 以下示例显示了两个证书。 CN 名称是要从中生成子证书的自签名根证书的名称。 在本例中,该根证书为“P2SRootCert”。

    Thumbprint                                Subject
    ----------                                -------
    AED812AD883826FF76B4D1D5A77B3C08EFA79F3F  CN=P2SChildCert4
    7181AA8C1B4D34EEDB2F3D3BEC5839F3FE52D655  CN=P2SRootCert
    
  3. 使用上一步骤中获取的指纹为根证书声明变量。 将 THUMBPRINT 替换为要从中生成子证书的根证书的指纹。

    $cert = Get-ChildItem -Path "Cert:\CurrentUser\My\<THUMBPRINT>"
    

    例如,使用上一步骤中 P2SRootCert 的指纹,该变量将如下所示:

    $cert = Get-ChildItem -Path "Cert:\CurrentUser\My\7181AA8C1B4D34EEDB2F3D3BEC5839F3FE52D655"
    
  4. 修改并运行示例以生成客户端证书。 如果在未经修改的情况下直接运行以下示例,会生成名为“P2SChildCert”的客户端证书。 如果想要为子证书指定其他名称,请修改 CN 值。 运行此示例时,请不要更改 TextExtension。 生成的客户端证书会自动安装在计算机上的“Certificates - Current User\Personal\Certificates”中。

    New-SelfSignedCertificate -Type Custom -DnsName P2SChildCert -KeySpec Signature `
    -Subject "CN=P2SChildCert" -KeyExportPolicy Exportable `
    -HashAlgorithm sha256 -KeyLength 2048 `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")
    

导出根证书公钥 (.cer)

创建自签名根证书后,导出根证书 .cer 文件(而非私钥)。 稍后将文件中包含的必要证书数据上传到 Azure。 以下步骤帮助你导出自签名根证书的 .cer 文件并取回必要的证书数据。

  1. 要获取证书 .cer 文件,请打开“管理用户证书”。

    找到自签名根证书(通常位于“Certificates - Current User\Personal\Certificates”中),并右键单击。 单击“所有任务”->“导出”。 此操作将打开“证书导出向导” 。

    如果在“Current User\Personal\Certificates”下找不到证书,可能是不小心打开了“证书 - 本地计算机”而不是“证书 - 当前用户”。

    屏幕截图显示“证书”窗口,其中依次选中了“所有任务”和“导出”。

  2. 在向导中,单击“下一步”。

  3. 选择“否,不导出私钥” ,并单击“下一步” 。

    屏幕截图显示不导出私钥。

  4. 在“导出文件格式” 页上,选择“Base-64 编码的 X.509 (.CER)” ,并单击“下一步” 。

    屏幕截图显示导出 Base-64 编码的文件。

  5. 对于“要导出的文件” ,“浏览” 到要将证书导出的目标位置。 在“文件名” 中,为证书文件命名。 然后单击“下一步”。

  6. 单击“完成” 导出证书。

  7. 你将看到一条确认消息,显示“导出成功”。

  8. 转到导出证书的位置,并使用文本编辑器(如记事本)将其打开。 如果以所需的 Base-64 编码的 X.509 (.CER) 格式导出证书,会显示类似于以下示例的文本。 蓝色突出显示的部分包含复制并上传到 Azure 的信息。

    屏幕截图显示在记事本中打开的 CER 文件,其中突出显示了证书数据。

    如果文件内容与示例不同,这通常意味着你没有使用 Base-64 编码的 X.509(.CER) 格式将其导出。 此外,如果使用记事本以外的文本编辑器,需了解,某些编辑器可能会在后台引入非预期的格式设置。 将此证书中的文本上传到 Azure 时,这可能会产生问题。

导出自签名根证书和私钥以将其存储(可选)

可能需要导出自签名根证书并将它存储在安全位置作为备份。 如果需要,可以稍后在另一台计算机上安装此自签名根证书,并生成更多客户端证书。 要将自签名根证书导出为 .pfx,请选择该根证书,然后使用导出客户端证书中所述的步骤导出。

导出客户端证书

生成客户端证书时,该证书会自动安装在用于生成它的计算机上。 如果想要在另一台客户端计算机上安装客户端证书,首先需要导出客户端证书。

  1. 若要导出客户端证书,请打开“管理用户证书” 。 生成的客户端证书默认位于“Certificates - Current User\Personal\Certificates”中。 右键单击要导出的客户端证书,单击“所有任务” ,并单击“导出” 打开“证书导出向导”。

    显示选择了“所有任务”和“导出”的证书窗口。

  2. 在“证书导出向导”中,单击“下一步”以继续。

  3. 选择“是,导出私钥” ,并单击“下一步” 。

    显示选择了“是,导出所选私钥”的屏幕截图。

  4. 在“导出文件格式” 页上,保留选择默认值。 请务必选中“包括证书路径中的所有证书(如果可能)”。 此外,此设置还会导出成功客户端身份验证所需的根证书信息。 否则,客户端身份验证会失败,因为客户端没有受信任的根证书。 然后单击“下一步”。

    “导出文件格式”页的屏幕截图。

  5. 在“安全性”页上,必须保护私钥。 如果选择使用密码,请务必记下或牢记为此证书设置的密码。 然后单击“下一步”。

    显示输入并确认的密码。

  6. 在“要导出的文件” 中,“浏览” 到要将证书导出的目标位置。 在“文件名” 中,为证书文件命名。 然后单击“下一步”。

  7. 单击“完成” 导出证书。

安装已导出的客户端证书

通过 P2S 连接的每个客户端都需要在本地安装客户端证书。 要安装客户端证书,请参阅为点到站点连接安装客户端证书

后续步骤

继续使用点到站点配置。