使用 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”。

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

  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. 单击“完成” 导出证书。

Linux

有关 Linux 步骤,请参阅《生成自签名证书 - Linux - OpenSSL》《生成自签名证书 - Linux - strongSwan》

安装已导出的客户端证书

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

后续步骤

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