为 IIS 创建有效的测试 SSL 证书

Posted

技术标签:

【中文标题】为 IIS 创建有效的测试 SSL 证书【英文标题】:creating valid test SSL certificates for IIS 【发布时间】:2016-08-20 16:59:43 【问题描述】:

我想在带有 IIS 的开发环境中测试 SSL 连接。为此,我需要创建一个安装在机器存储中的自签名根证书,以及另一个使用根证书签名的证书以安装在 IIS 中。

现在不推荐使用makecert 执行此操作,所以我想知道如何使用 Powershell 和New-SelfSignedCertificate 命令执行此操作。

如果您正确设置了密钥使用设置,将获得奖励积分 :-)

注意:直接在 IIS 中使用自签名证书不起作用,因为浏览器和 WCF 认为它们无效。


作为参考,这里是使用 makecert 的方法:

# create the self signed root certificate 
makecert -n "CN=root.lan" -r -sv root.pvk root.cer

# create the certificate for IIS that gets signed with the root certificate 
makecert -sk "Local Certificate" -iv root.pvk -n "CN=localhost" -ic root.cer -sr localmachine -ss my -sky exchange -pe

# convert to other formats 
cert2spc localhost.cer localhost.spc
pvk2pfx -pvk localhost.pvk -spc localhost.spc -pfx localhost.pfx

【问题讨论】:

如果您只使用 RSA 密钥,MakeCert.exe 就足够了,但最好使用 MakeCert.exe 的一些附加选项。 New-SelfSignedCertificate 不会给你带来任何好处。互联网上可用的其他 Powershell 模块可能会更好。您可以使用OpenSSL.exe 而不是MakeCert.exe 创建可以在IIS 上使用的RSA 或椭圆曲线证书。如果您的 IIS 服务器可通过 Internet(端口 80)使用,那么您可以使用 Let's Encrypt 获得免费的真实 SSL 证书,并且客户端无需在受信任的根目录中安装您的“CA”证书。 问题是使用New-SelfSignedCertificate 是有原因的。我不想使用MakeCertOpenSSL 只需使用启动 powershell 并使用New-SelfSignedCertificate -?get-help New-SelfSignedCertificate -examples。可能性取决于您使用的 Windows 版本。比较 technet.microsoft.com/en-us/library/hh848633.aspx 和 technet.microsoft.com/en-us/library/hh848633(v=wps.630).aspx 我的操作系统是 Windows 10。 powershell 版本的更新还应该在旧系统上启用新功能。我猜-ExistingKey 参数可能是解决方案的关键(如MakeCert 中的-iv 参数)。但是,到目前为止我还没有找到一个例子。 在我看来,-Signer 指定了 CA 证书。我做了一些测试,很快就会发布我的答案并附上使用示例。 【参考方案1】:

包含在 Windows 10 中的新版本 New-SelfSignedCertificate 描述为 here。可以使用New-SelfSignedCertificate -?get-help New-SelfSignedCertificate -examples 来获取一些附加信息。

文档和示例似乎仍然不够清晰,无法创建两个证书:

一个自签名证书,将用作示例中的 CA 证书 第二个 SSL 证书,使用第一个证书签名。

实现可能如下(我在选项下方写了多行只是为了使文本更具可读性):

New-SelfSignedCertificate -HashAlgorithm sha384 -KeyAlgorithm RSA -KeyLength 4096
    -Subject "CN=My Test (PowerShell) Root Authority,O=OK soft GmbH,C=DE"
    -KeyUsage DigitalSignature,CertSign -NotAfter (get-date).AddYears(10)
    -CertStoreLocation "Cert:\CurrentUser\My" -Type Custom 

输出看起来像

    Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My


Thumbprint                                Subject
----------                                -------
B7DE93CB88E99B01D166A986F7BF2D82A0E541FF  CN=My Test (PowerShell) Root Authority, O=OK soft GmbH, C=DE

B7DE93CB88E99B01D166A986F7BF2D82A0E541FF 对于使用证书进行签名很重要。如果您忘记了值,您可以通过 CN 名称找到它

dir cert:\CurrentUser\My | where Subject -Like "CN=My Test (PowerShell)*"

或通过使用certutil.exe -user -store My 在当前用户的我的商店中显示证书。

要创建 SSL 证书并根据先前创建的证书对其进行签名,例如可以执行以下操作

New-SelfSignedCertificate -Type Custom -Subject "CN=ok01.no-ip.org"
    -HashAlgorithm sha256 -KeyAlgorithm RSA -KeyLength 2048
    -KeyUsage KeyEncipherment,DigitalSignature
    -CertStoreLocation "cert:\LocalMachine\My"
    -Signer cert:\CurrentUser\My\B7DE93CB88E99B01D166A986F7BF2D82A0E541FF
    -TextExtension @("2.5.29.37=text1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2","2.5.29.17=textDNS=ok01.no-ip.org&DNS=ok01.fritz.box")

在我看来,最终证书将具有所需的所有属性。很明显,来自上述参数的许多值仅包含示例,您必须根据您的要求在那里修改。其他一些常见的步骤,比如在 Trusted Root 中导入根证书,导出证书等等,我这里就不赘述了。这些步骤不是您主要问题的 psrt。

【讨论】:

@MovGP0:不客气!我仍然建议您看一下 Let's Encrypt。看看here。我个人使用 letsencrypt-win-simple 使用 Let's Encrypt 授权创建 SSL 证书,该授权在所有计算机上都受信任。 我需要为 CA 证书指定 -KeyUsage DigitalSignature,CertSign,否则 Web 浏览器不会验证“子”证书。 @Simon_Weaver:谢谢!我更改了用于生成根证书的-KeyUsage 参数的值。

以上是关于为 IIS 创建有效的测试 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

IIS6:从命令行创建/安装 SSL 自签名证书

如何为通过 SSL 进行双向身份验证的本地测试创建客户端证书?

阿里云购买的域名,买的ssl证书,怎么让证书有效?怎么配置证书到域名上面去

iis装ssl证书串站点怎么解决

如何安装SSL证书 4种方法来安装SSL证书

当 SSL 证书不再有效时从 https 重定向到 http