我不得不通过结合给定答案和更多资源中的点点滴滴来解决 Windows 上的自签名证书。这是我自己的(希望是完整的)演练。希望它能让你摆脱我自己痛苦的学习曲线。它还包含有关相关主题的信息,这些信息迟早会在您创建自己的证书时弹出。
在 Windows 10 及更低版本上创建自签名证书
不要使用 makecert.exe。它已被 Microsoft 弃用。
现代方式使用 Powershell 命令。
视窗 10:
以管理员权限打开 Powershell:
New-SelfSignedCertificate -DnsName "*.dev.local", "dev.local", "localhost" -CertStoreLocation cert:\LocalMachine\My -FriendlyName "Dev Cert *.dev.local, dev.local, localhost" -NotAfter (Get-Date).AddYears(15)
Windows 8、Windows Server 2012 R2:
在这些系统上的 Powershell 中,参数 -FriendlyName 和 -NotAfter 不存在。只需从上面的命令行中删除它们。
以管理员权限打开 Powershell:
New-SelfSignedCertificate -DnsName "*.dev.local", "dev.local", "localhost" -CertStoreLocation cert:\LocalMachine\My
另一种方法是使用下面的旧 Windows 版本的方法,它允许您使用 Win 10 的所有功能来创建证书...
较旧的 Windows 版本:
我对旧 Windows 版本的建议是在 Win 10 机器上创建证书,使用 mmc 实例将其导出到 .PFX 文件(请参阅下面的“信任证书”)并将其导入目标机器上的证书存储区旧的 Windows 操作系统。要导入证书,请不要右键单击它。尽管上下文菜单中有一个“导入证书”项,但我在 Win Server 2008 上使用它的所有尝试都失败了。而是在目标机器上打开另一个 mmc 实例,导航到“证书(本地计算机)/个人/证书” ,右键单击中间窗格并选择所有任务 → 导入。
生成的证书
上述两个命令都为域localhost
和*.dev.local
.
Win10 版本还具有 15 年的生存时间和“Dev Cert *.dev.local, dev.local, localhost”的可读显示名称。
更新:如果您在参数中提供多个主机名条目-DnsName
(如上所示),这些条目中的第一个将成为域的主题(AKA 通用名称)。所有主机名条目的完整列表将存储在证书的主题备用名称 (SAN) 字段中。(感谢@BenSewards 指出这一点。)
创建后,证书将立即在 IIS 的任何 HTTPS 绑定中可用(说明如下)。
信任证书
新证书不是任何信任链的一部分,因此任何浏览器都不认为是值得信赖的。为了改变这一点,我们会将证书复制到您机器上受信任的根 CA 的证书存储中:
打开mmc.exe,文件→添加/删除管理单元→在左栏中选择“证书”→添加→选择“计算机帐户”→下一步→“本地计算机...”→完成→确定
在左栏中选择“证书(本地计算机)/个人/证书”。
找到新创建的证书(在 Win 10 中,“友好名称”列可能会有所帮助)。
选择此证书并按 Ctrl-C 将其复制到剪贴板。
在左栏中选择“证书(本地计算机)/受信任的根 CA/证书”。
按 Ctrl-V 将您的证书粘贴到此商店。
该证书应出现在受信任的根权限列表中,并且现在被认为是值得信赖的。
在 IIS 中使用
现在您可以进入 IIS 管理器,选择本地网站的绑定 → 添加 → https → 输入表单的主机名 myname.dev.local
(您的证书仅对 有效*.dev.local
)并选择新证书 → 确定。
添加到主机
还将您的主机名添加到 C:\Windows\System32\drivers\etc\hosts:
127.0.0.1 myname.dev.local
快乐的
现在 Chrome 和 IE 应该将证书视为值得信赖的,并在您打开时加载您的网站https://myname.dev.local
。
Firefox 维护自己的证书存储。要在此处添加您的证书,您必须在 FF 中打开您的网站,并在 FF 警告您有关证书时将其添加到例外中。
对于 Edge 浏览器,可能需要更多操作(请参阅下文)。
测试证书
要测试您的证书,Firefox 是您的最佳选择。(相信我,我自己也是 Chrome 的粉丝,但在这种情况下 FF 更好。)
以下是原因:
- Firefox 使用自己的 SSL 缓存,该缓存在 shift-reload 时被清除。因此,对本地网站证书的任何更改都会立即反映在 FF 的警告中,而其他浏览器可能需要重新启动或手动清除 Windows SSL 缓存。
- FF 还为您提供了一些有价值的提示来检查您的证书的有效性: 当 FF 显示其证书警告时,单击高级。FF 将在文本块的中心行显示一个简短的文本块,其中包含一个或多个可能的警告:
该证书不受信任,因为它是自签名的。
这个警告是正确的!如上所述,Firefox 不使用 Windows 证书存储,并且只会信任此证书,前提是您在 Firefox 中为其添加例外。执行此操作的按钮位于警告下方。
证书对姓名无效...
此警告表明,您做错了什么。您证书的(通配符)域与您网站的域不匹配。该问题必须通过更改您网站的(子)域或颁发匹配的新证书来解决。事实上,即使证书不匹配,您也可以在 FF 中添加一个例外,但您永远不会在 Chrome 中使用这种组合获得绿色挂锁符号。
Firefox 可以在此位置显示许多其他不错且易于理解的证书警告,例如过期证书、具有过时签名算法的证书等。我发现没有其他浏览器可以给我这种级别的反馈来确定任何问题。
我应该选择开发哪种(子)域模式?
在上面的 New-SelfSignedCertificate 命令中,我们使用了通配符 domain *.dev.local
。
你可能会想:为什么不使用*.local
?
原因很简单:作为通配符域是非法的。
通配符证书必须至少包含文字二级域名。星号 (*) 只允许从第三层以上。
因此,xyz.local
当您在 HTTP 下开发并且不需要证书时,表单的域是可以的。但是,如果您将该域模式与 HTTPS 一起使用,您将被迫为您启动的每个新项目颁发一个新的匹配证书。更好地使用表单域xyz.dev.local
和*.dev.local
.
重要的旁注:
- 有效的主机域只能包含字母 a 到 z、数字、连字符和点。不允许使用下划线!一些浏览器对这个细节非常挑剔,当他们顽固地拒绝将您的域
motör_head.dev.local
与您的通配符模式匹配时,可能会给您带来困难*.dev.local
。当您切换到motoer-head.dev.local
.
- 证书中的通配符只会匹配域中的一个标签(= 两个点之间的部分),不再匹配。
*.dev.local
匹配 myname.dev.local
但不匹配other.myname.dev.local
!
*.*.dev.local
证书中不能使用多级通配符 ( )。所以other.myname.dev.local
只能被形式的通配符覆盖*.myname.dev.local
。因此,最好不要使用第四级域部分。将所有变体放入第三级部分。这样,您将获得所有开发站点的单一证书。
Edge的问题
这实际上与自签名证书无关,但仍然与整个过程有关:
按照上述步骤进行操作后,Edge打开时可能不会显示任何myname.dev.local
内容。
原因是现代应用程序的 Windows 10 网络管理的一个特征,称为“网络隔离”。
要解决该问题,请以管理员权限打开命令提示符并输入以下命令:
CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe
有关边缘和网络隔离的更多信息可以在这里找到:
https ://blogs.msdn.microsoft.com/msgulfcommunity/2015/07/01/how-to-debug-localhost-on-microsoft-edge/