如何在 Windows10及以下版本中为开发域名创建自签名证书?

我有用于开发目的的 subdomain.example.com。我的 web 应用程序解决方案包含一个 web API 等,我需要从外部系统调用,因此我没有使用本地主机。

现在我需要测试 SSL,并且需要一个 subdomain.example.com开发域名的证书。

我尝试创建 http://technet.microsoft.com/en-us/library/cc753127(v=ws.10).aspx中概述的自签名证书,但是该证书仅适用于 localhost。这个证书可以用于我的目的,还是我必须为我的开发子域名创建一个自签名?如果我必须为我的开发子域名创建一个自签名认证,我可以使用什么实用工具或在线服务(免费) ?

185101 次浏览

使用 PowerShell

从 Windows 8.1和 Windows Server 2012 R2(Windows PowerShell 4.0)或更高版本,您可以使用新的 New-SelfSignedCertificate cmdlet 创建一个自签名证书:

例子:

New-SelfSignedCertificate -DnsName www.mydomain.example -CertStoreLocation cert:\LocalMachine\My


New-SelfSignedCertificate -DnsName subdomain.mydomain.example -CertStoreLocation cert:\LocalMachine\My


New-SelfSignedCertificate -DnsName *.mydomain.example -CertStoreLocation cert:\LocalMachine\My

使用 IIS 管理器

  1. 启动 IIS 管理器
  2. 在服务器级别的 IIS 下,选择“服务器证书”
  3. 在 Actions 下的右手边,选择 Create Self-Signed Securities
  4. 其中说“为证书指定一个友好的名称”类型为适当的名称以供参考。
    1. 例子: www.domain.examplesubdomain.domain.example
  5. 然后,从左边的列表中选择您的网站
  6. 在 Actions 下的右侧选择 Bindings
  7. 添加新的 HTTPS 绑定并选择刚刚创建的证书(如果证书是通配符证书,则需要指定主机名)
  8. 单击 OK 并测试它。

使用 IIS 的自签名证书特性,您无法为证书设置公共名称(CN) ,因此无法创建绑定到所选子域的证书。

解决这个问题的一种方法是使用 makecert.exe,它与。Net 2.0 SDK.在我的服务器上:

C:\Program Files\Microsoft.Net\SDK\v2.0 64bit\Bin\makecert.exe

您可以创建一个签名权限并将其存储在 LocalMachine 证书存储库中,如下所示(这些命令必须从 Administrator 帐户或在提升的命令提示符中运行) :

makecert.exe -n "CN=My Company Development Root CA,O=My Company,
OU=Development,L=Wallkill,S=NY,C=US" -pe -ss Root -sr LocalMachine
-sky exchange -m 120 -a sha1 -len 2048 -r

然后,您可以创建一个绑定到您的子域并由您的新授权机构签名的证书:

(注意-in 参数的值必须与上面用于生成权限的 CN 值相同。)

makecert.exe -n "CN=subdomain.example.com" -pe -ss My -sr LocalMachine
-sky exchange -m 120 -in "My Company Development Root CA" -is Root
-ir LocalMachine -a sha1 -eku 1.3.6.1.5.5.7.3.1

您的证书应该出现在 IIS 管理器绑定到您的网站,如汤姆霍尔的职位解释。

所有的荣誉为这个解决方案的迈克奥布莱恩为他出色的博客文章在 http://www.mikeobrien.net/blog/creating-self-signed-wildcard

为特定域创建新证书:

作为管理员打开 PowerShell ISE,运行以下命令:

New-SelfSignedCertificate -DnsName *.mydomain.example, localhost -CertStoreLocation cert:\LocalMachine\My

信任新证书:

  • 打开 mmc.exe
  • 转到控制台根-> 证书(本地计算机)-> 个人
  • 选择已创建的证书,右键单击-> All Tasks-> Export,然后按照导出向导创建。Pfx 文件
  • 转到控制台根-> 证书-> 受信任的根证书颁发机构并导入新的. pfx 文件

将证书绑定到您的站点:

  • 打开 IIS 管理器
  • 选择您的网站并在右窗格中选择 Edit Site-> Bindings
  • 使用正确的主机名和新证书添加新的 HTTPS 绑定

当我想对 IIS8上托管的项目启用 SSL 时,也遇到了同样的问题。我在我的博客 给你上发布了一篇详细的文章,但我不想给你一个链接的答案。最后,我使用的工具是 OpenSSL,经过多天与 Makecert命令的斗争。证书是在 Debian 中生成的,但是我可以将它无缝地导入到 IIS7和8中。

下载与操作系统和 这个配置文件兼容的 OpenSSL。将配置文件设置为 OpenSSL 的默认配置。

首先,我们将生成证书颁发机构(CA)的私钥和证书。此证书用于签署证书请求(CSR)。

您必须完成此过程中所需的所有字段。

  1. openssl req -new -x509 -days 3650 -extensions v3_ca -keyout root-cakey.pem -out root-cacert.pem -newkey rsa:4096

您可以创建一个配置文件,其默认设置如下: 现在我们将生成证书请求,它是发送给证书颁发机构的文件。

公共名称必须设置站点的域,例如: Public.organization.com

  1. openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:4096

现在证书请求已经用生成的 CA 证书签名。

  1. openssl x509 -req -days 365 -CA root-cacert.pem -CAkey root-cakey.pem -CAcreateserial -in server-csr.pem -out server-cert.pem

生成的证书必须导出到可导入 IIS 的. pfx 文件。

  1. openssl pkcs12 -export -out server-cert.pfx -inkey server-key.pem -in server-cert.pem -certfile root-cacert.pem -name "Self Signed Server Certificate"

在这个步骤中,我们将导入证书 CA。

  1. 在服务器中,必须将 CA 证书导入到受信任的根证书颁发机构,因为 IIS 可以信任要导入的证书。请记住,要导入到 IIS 中的证书已经与 CA 的证书签名。
  • 打开命令提示符并键入 Mmc
  • 点击 档案
  • 选择 添加/删除..。
  • 双击 证书
  • 选择 电脑帐户下一页->
  • 选择 本地电脑结束
  • 好的。
  • 转到 证书-> 受信任的根证书颁发机构-> 证书,右键单击 证书并选择 所有任务-> 进口..。

enter image description here

  • 选择 下一个-> 浏览..。
  • 必须选择 所有档案才能浏览 根-仙人掌文件的位置。
  • 单击 下一个并选择 将所有证书放在下面的存储中: 受信任的根证书颁发机构
  • 点击 下一个结束

enter image description here

通过此步骤,IIS 信任我们的证书的真实性。

  1. 在最后一步中,我们将把证书导入到 IIS 并添加绑定站点。
  • 在命令提示符下打开 互联网资讯服务经理或键入 Inetmgr,然后转到 服务器证书
  • 点击 进口..。
  • 网站托管上设置. pfx 文件的路径、密码短语和 Select 证书存储。

enter image description here

  • 点击 好的

  • 现在转到 IIS 管理器上的站点,选择 束缚..。新绑定。

  • 选择 https 作为绑定类型,您应该能够看到导入的证书。

  • 点击 好的,一切就完成了。

enter image description here

另一种生成自签名证书的简单方法是使用 Jexus Manager,

Jexus Manager

  1. 在 Connections 面板中选择一个服务器节点。
  2. 在中间面板中,单击“服务器证书”图标以打开管理页。
  3. 在“操作”面板下,单击“生成自签名证书...”菜单项。

Https://docs.jexusmanager.com/tutorials/self-signed.html

另一种选择是创建一个自签名证书,允许您指定每个网站的域名。这意味着您可以跨多个域名使用它。

在 IIS 管理器中

  1. 单击计算机名节点
  2. 打开服务器证书
  3. 在“操作”面板中,选择“创建自签名证书”
  4. 在“指定一个友好的名称...”命名它 * Dev (从类型列表中选择“ Personal”)
  5. 保存

在你的 IIS 网站上。

  1. 管理绑定
  2. 为 Https 创建一个新绑定
  3. 从列表中选择您的自签名证书
  4. 一旦选择,域名框将被启用,您将能够输入您的域名。

enter image description here

我不得不通过组合来自给定答案和更多资源的零碎信息来在 Windows 上查找自签名证书。下面是我自己的(希望是完整的)演练。希望这能让你免受我痛苦的学习过程。它还包含关于相关主题的信息,这些信息在您创建自己的证书时迟早会弹出。

在 Windows10及以下版本中创建自签名证书

不要使用 makecert.exe,它已经被微软弃用。
现代方法使用 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)

Windows8,WindowsServer2012R2:

在 Powershell,这些系统的参数-FriendlyName 和-NotAfter 不存在。只需从上面的命令行中删除它们。
打开具有管理员权限的 Powershell:

New-SelfSignedCertificate  -DnsName "*.dev.local", "dev.local", "localhost"  -CertStoreLocation cert:\LocalMachine\My

另一种方法是使用旧的 Windows 版本下面的方法,它允许您使用 Win10的所有功能的证书创建..。

旧版本:

对于较老的 Windows 版本,我的建议是在 Win10机器上创建证书,然后将其导出到。使用 mmc 实例的 PFX 文件(请参见下面的“信任证书”) ,并将其导入到使用旧 Windows OS 的目标机器上的 cert 存储中。要导入证书,不要右键单击它。尽管在上下文菜单中有一个“导入证书”项,但是在 WinServer2008上使用它的所有试验都失败了。相反,在目标计算机上打开另一个 mmc 实例,导航到“证书(本地计算机)/个人/证书”,右键单击中间窗格并选择“所有任务→导入”。

结果证书

上述两个命令都为域 localhost*.dev.local创建证书。
此外,Win10版本还有15年的使用寿命,以及一个可读的显示名称“ Dev Cert *”。本地,本地,本地主机”。

更新: 如果在参数 -DnsName中提供多个主机名条目(如上所示) ,这些条目中的第一个将成为域的 Subject (AKA Common Name)。所有主机名条目的完整列表将存储在证书的 Subject Alternative Name (SAN)字段中。(感谢@BenSeward 指出这一点。)

创建之后,该证书将立即在 IIS 的任何 HTTPS 绑定中可用(下面的说明)。

相信证书

新的证书不是任何信任链的一部分,因此任何浏览器都认为它不可信。要改变这一点,我们将把该证书复制到计算机上的受信任根 CA 的证书存储区:

打开 mmc.exe,文件→添加/删除管理单元→在左栏中选择“证书”→添加→选择“计算机帐户”→下一步→“本地计算机...”→完成→确定

在左栏选择「证书(本地电脑)/个人/证书」。
找到新创建的证书(在 Win 10中“ Friendly name”列可能有帮助)。
选择此证书并按 Ctrl-C 将其复制到剪贴板。

在左栏中选择“证书(本地计算机)/可信根 CA/证书”。
按 Ctrl-V 将证书粘贴到此商店。
证书应该出现在受信任的根权威列表中,并且现在被认为是可信任的。

在 IIS 中使用

现在你可以进入 IIS 管理器,选择本地网站的绑定→添加→ https →输入表单 myname.dev.local的主机名(你的证书只对 *.dev.local有效) ,然后选择新的证书→ OK。

添加到主机

还要将您的主机名添加到 C: WindowsSystem32驱动程序等主机:

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 显示其证书警告时,单击 Advanced。FF 会在文本块的中心线显示一个带有一个或多个可能警告的短文本块:

该证书不受信任,因为它是自签名的。

这个警告是正确的!如上所述,Firefox 不使用 Windows 证书存储,只有在 Firefox 中为该证书添加异常时,它才会信任该证书。执行此操作的按钮就在警告的正下方。

该证书对名称无效..。

这个警告表明,你做错了什么。证书的(通配符)域与网站的域不匹配。这个问题必须通过改变您的网站的(子)域名或通过颁发一个新的证书匹配来解决。事实上,即使证书不匹配,你也可以在 FF 中添加一个异常,但是你永远不会在 Chrome 中得到一个绿色的挂锁符号。

Firefox 可以在这个地方显示许多其他不错的、易于理解的证书警告,比如过期的证书,带有过时签名算法的证书等等。我发现没有其他的浏览器能给我如此高的反馈来解决任何问题。

我应该选择开发哪种(子)领域模式?

在上面的 New-SelfSignedCertificate 命令中,我们使用了通配符域 *.dev.local

您可能会想: 为什么不使用 *.local

原因很简单: 它作为通配符域是非法的。
通配符证书 必须的至少包含一个字面的二级域名。星号(*)只允许从第三层向上。

因此,当您在 HTTP 下开发时,表单 xyz.local的域是可以的,并且不需要证书。但是,如果您将该域模式与 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 的问题

这实际上与自签名证书无关,但仍与整个过程有关:
在执行上述步骤之后,打开 myname.dev.local时 Edge 可能不会显示 任何内容。
原因是 Windows10现代应用程序网络管理的一个特征,称为“网络隔离”。

要解决这个问题,请打开一个具有 Administrator 特权的命令提示符,然后输入以下命令:

CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe

更多关于边缘和网络隔离的信息可以在这里找到: Https://blogs.msdn.microsoft.com/msgulfcommunity/2015/07/01/how-to-debug-localhost-on-microsoft-edge/