使用 PowerShell 生成和导出用于用户 VPN 连接的证书
可以将用户 VPN(点到站点)配置为需要证书进行身份验证。 本文介绍如何在 Windows 10(或更高版本)或 Windows Server 2016(或更高版本)上使用 PowerShell 创建自签名根证书并生成客户端证书。
用于生成证书的 PowerShell cmdlet 是操作系统的一部分,不能在其他版本的 Windows 上运行。 只需主机操作系统生成证书。 生成证书后,可以将它们上传或安装在任何受支持的客户端操作系统上。
如果没有符合操作系统要求的计算机,可以使用 MakeCert 生成证书。 使用任一方法生成的证书均可安装在支持的所有客户端操作系统上。
创建自签名根证书
使用 New-SelfSignedCertificate cmdlet 创建自签名根证书。 有关参数的其他信息,请参阅 New-SelfSignedCertificate。
在运行 Windows 10 或更高版本或 Windows Server 2016 的计算机上,使用提升的权限打开 Windows PowerShell 控制台。
创建自签名根证书。 以下示例创建了名为“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
使 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 会话,请使用以下步骤:
识别安装在计算机上的自签名根证书。 此 cmdlet 将返回计算机上安装的证书列表。
Get-ChildItem -Path "Cert:\CurrentUser\My"
从返回的列表中找到使用者名称,然后将该名称旁边的指纹复制到文本文件中。 以下示例显示了两个证书。 CN 名称是要从中生成子证书的自签名根证书的名称。 在本例中,该根证书为“P2SRootCert”。
Thumbprint Subject ---------- ------- AED812AD883826FF76B4D1D5A77B3C08EFA79F3F CN=P2SChildCert4 7181AA8C1B4D34EEDB2F3D3BEC5839F3FE52D655 CN=P2SRootCert
使用上一步骤中获取的指纹为根证书声明变量。 将 THUMBPRINT 替换为要从中生成子证书的根证书的指纹。
$cert = Get-ChildItem -Path "Cert:\CurrentUser\My\<THUMBPRINT>"
例如,使用上一步骤中 P2SRootCert 的指纹,该变量将如下所示:
$cert = Get-ChildItem -Path "Cert:\CurrentUser\My\7181AA8C1B4D34EEDB2F3D3BEC5839F3FE52D655"
修改并运行示例以生成客户端证书。 如果在未经修改的情况下直接运行以下示例,会生成名为“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 文件并取回必要的证书数据:
要获取证书 .cer 文件,请打开“管理用户证书”。
找到自签名根证书(通常位于“Certificates - Current User\Personal\Certificates”中),并右键单击。 选择“所有任务”->“导出”。 此操作将打开“证书导出向导” 。
如果在“Current User\Personal\Certificates”下找不到证书,可能是不小心打开了“Certificates - Local Computer”而不是“Certificates - Current User”。
在向导中,选择“下一步”。
选择“否,不导出私钥”,然后选择“下一步”。
在“导出文件格式”页上,选择“Base-64 编码的 X.509 (.CER)”,然后选择“下一步”。
对于“要导出的文件” ,“浏览” 到要将证书导出的目标位置。 在“文件名” 中,为证书文件命名。 然后选择下一步。
选择“完成”导出证书。
你会看到一条确认消息,显示“导出成功”。
转到导出证书的位置并用文字编辑器(例如,记事本)打开它。 如果以所需的 Base-64 编码的 X.509 (.CER) 格式导出证书,会显示类似于以下示例的文本。 蓝色高光部分包含了复制并上传到Azure的信息。
如果文件内容与示例不同,这通常意味着你没有使用 Base-64 编码的 X.509(.CER) 格式将其导出。 此外,如果使用记事本以外的文本编辑器,需了解,某些编辑器可能会在后台引入非预期的格式设置。 将此证书中的文本上传到 Azure 时,这可能会产生问题。
导出自签名根证书和私钥以将其存储(可选)
可能需要导出自签名根证书并将它存储在安全位置作为备份。 如果需要,可以稍后在另一台计算机上安装此自签名根证书,并生成更多客户端证书。 要将自签名根证书导出为 .pfx,请选择该根证书,然后使用导出客户端证书中所述的步骤导出。
导出客户端证书
生成客户端证书时,该证书会自动安装在用于生成它的计算机上。 如果想要在另一台客户端计算机上安装客户端证书,首先需要导出客户端证书。
若要导出客户端证书,请打开“管理用户证书” 。 生成的客户端证书默认位于“Certificates - Current User\Personal\Certificates”中。 右键单击要导出的客户端证书,单击“所有任务” ,并单击“导出” 打开“证书导出向导”。
在“证书导出向导”中,单击“下一步”以继续。
选择“是,导出私钥” ,并单击“下一步” 。
在“导出文件格式” 页上,保留选择默认值。 请务必选中“包括证书路径中的所有证书(如果可能)”。 此外,此设置还会导出成功客户端身份验证所需的根证书信息。 否则,客户端身份验证会失败,因为客户端没有受信任的根证书。 然后单击“下一步”。
在“安全性”页上,必须保护私钥。 如果选择使用密码,请务必记下或牢记为此证书设置的密码。 然后单击“下一步”。
在“要导出的文件” 中,“浏览” 到要将证书导出的目标位置。 在“文件名” 中,为证书文件命名。 然后单击“下一步”。
单击“完成” 导出证书。
Linux
有关 Linux 步骤,请参阅《生成自签名证书 - Linux - OpenSSL》或《生成自签名证书 - Linux - strongSwan》。
安装已导出的客户端证书
通过 P2S 连接进行连接的每个客户端都需要在本地安装客户端证书。 如需证书安装步骤,请参阅安装客户端证书。
后续步骤
继续阅读用户 VPN 连接的虚拟 WAN 步骤。