使用 PowerShell 生成和导出用于用户 VPN 连接的证书

可以将用户 VPN(点到站点)配置为需要证书进行身份验证。 本文介绍如何在 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” 或“管理用户证书” ,即可查看证书。

    在使用此示例之前,请进行任何所需的修改。 “NotAfter”参数是可选的。 默认情况下,如果没有此参数,证书将在 1 年后过期。

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

生成客户端证书

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

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

这些示例使用 New-SelfSignedCertificate cmdlet 生成客户端证书。

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

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

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


   $params = @{
       Type = 'Custom'
       Subject = 'CN=P2SChildCert'
       DnsName = 'P2SChildCert'
       KeySpec = 'Signature'
       KeyExportPolicy = 'Exportable'
       KeyLength = 2048
       HashAlgorithm = 'sha256'
       NotAfter = (Get-Date).AddMonths(18)
       CertStoreLocation = 'Cert:\CurrentUser\My'
       Signer = $cert
       TextExtension = @(
        '2.5.29.37={text}1.3.6.1.5.5.7.3.2')
   }
   New-SelfSignedCertificate @params

示例 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”中。

    $params = @{
        Type = 'Custom'
        Subject = 'CN=P2SChildCert'
        DnsName = 'P2SChildCert1'
        KeySpec = 'Signature'
        KeyExportPolicy = 'Exportable'
        KeyLength = 2048
        HashAlgorithm = 'sha256'
        NotAfter = (Get-Date).AddMonths(18)
        CertStoreLocation = 'Cert:\CurrentUser\My'
        Signer = $cert
        TextExtension = @(
         '2.5.29.37={text}1.3.6.1.5.5.7.3.2')
    }
    New-SelfSignedCertificate @params
    

导出根证书公钥 (.cer)

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

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

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

    如果在 "Current User\Personal\Certificates"下找不到证书,可能是你意外地打开了“Certificates - Local Computer”而不是“Certificates - Current User”)。

    Screenshot shows the Certificates window with All Tasks then Export selected.

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

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

    Screenshot shows Do not export the private key.

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

    Screenshot shows export Base-64 encoded.

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

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

  7. 会看到一条确认显示"证书已成功导出"。

  8. 转到导出证书的位置并用文字编辑器(例如,记事本)打开它。 如果你使用所要求的Base-64 编码的 X.509 (.CER) 格式导出证书,你会看到类似此实例的内容。 蓝色高光部分包含了复制并上传到Azure的信息。

    Screenshot shows the CER file open in Notepad with the certificate data highlighted.

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

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

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

导出客户端证书

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

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

    Screenshot shows the Certificates window with All Tasks and Export selected.

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

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

    Screenshot showing Yes export the private key selected.

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

    Screenshot for export file format page.

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

    Screenshot shows password entered and confirmed.

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

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

安装已导出的客户端证书

通过 P2S 连接进行连接的每个客户端都需要在本地安装客户端证书。 如需证书安装步骤,请参阅安装客户端证书

后续步骤

继续阅读用户 VPN 连接的虚拟 WAN 步骤