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

8
我希望在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.exeNew-SelfSignedCertificate没有任何优势。互联网上提供的其他Powershell模块可能更好。您可以使用OpenSSL.exe代替MakeCert.exe创建RSA或椭圆曲线证书,这些证书可用于IIS。如果您的IIS服务器可以通过Internet(端口80)访问,则可以使用Let's Encrypt免费获取真实的SSL证书,客户端无需在受信任的根中安装您的“CA”证书。 - Oleg
1
问题是要使用 New-SelfSignedCertificate,我不想使用 MakeCertOpenSSL - MovGP0
只需使用启动 PowerShell 并使用 New-SelfSignedCertificate -?get-help New-SelfSignedCertificate -examples 命令。这取决于您使用的 Windows 版本的可能性。请参阅 https://technet.microsoft.com/zh-cn/library/hh848633.aspx 和 https://technet.microsoft.com/zh-cn/library/hh848633(v=wps.630).aspx 进行比较。 - Oleg
操作系统是 Windows 10。在我的情况下,PowerShell 版本的更新应该也能使旧系统支持新功能。我猜 -ExistingKey 参数可能是解决方案的关键(就像 MakeCert 中的 -iv 参数一样)。但是,到目前为止我还没有找到一个例子。 - MovGP0
我认为-Signer指定了CA证书。我进行了一些测试,并很快会发布我的答案,其中包括使用示例。 - Oleg
1个回答

8
新版本的New-SelfSignedCertificate已经包含在Windows 10中,详情可以参考这里。使用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来显示当前用户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={text}1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2","2.5.29.17={text}DNS=ok01.no-ip.org&DNS=ok01.fritz.box")

在我看来,最终证书将具有所需的所有属性。很明显,上述许多参数中的值仅包含示例,您必须根据自己的要求进行修改。我不会在此处描述其他常见步骤,例如将根证书导入受信任的根、导出证书等等。这些步骤不是您主要问题的一部分。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接