如何为要开发的域名创建自签名证书?


122

我有将subdomain.example.com其用于开发目的。我的Web应用程序解决方案包含一个Web API等,我需要从外部系统调用它,因此我没有使用localhost。

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

我曾尝试创建http://technet.microsoft.com/zh-cn/library/cc753127(v=ws.10).aspx中概述的自签名证书,但是该证书仅适用于本地主机。可以将此证书用于我的目的,还是必须为自己的开发子域创建一个自签名?如果必须为我的开发子域创建一个自签名证书,我可以为此使用什么实用程序或在线服务(免费)?

Answers:


133

使用IIS的自签名证书功能,您不能为证书设置公用名(CN),因此无法创建绑定到您选择的子域的证书。

解决该问题的一种方法是使用与.Net 2.0 SDK捆绑在一起的makecert.exe。在我的服务器上,它位于:

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

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

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管理器中,以绑定到您的站点,如Tom Hall的帖子中所述。

Mike O'Brien在http://www.mikeobrien.net/blog/creating-self-signed-wildcard上的出色博文中对此解决方案的所有赞誉


8
我能够完成这项工作。我必须使用Visual Studio 2010命令提示符makecert.exe才能进入路径。对于证书,我认为我会更安全和更实用-a SHA512 -len 8192-它花了永远的时间。就像我怀疑的那样,它对IIS使用的加密级别没有什么影响。默认情况下,IIS使用128位,您必须执行组策略操作才能更改此设置。请其他读者进一步注意:不要更改后的魔术数字-eku,它们是必需的。
— BrainSlugs83 2014年

3
从具有管理员权限的命令提示符处运行以上所有命令,否则您将收到“错误:保存编码的证书以存储失败=> 0x5”消息。
— 吉尔斯·罗伯茨

1
我还想分享一个很棒的链接,使用makecert.exe创建自签名证书以进行开发。该链接说明了创建根证书,服务器证书和客户端证书的分步方法。另外,还有用于解释如何使用它们的帖子。
— Vikram Singh Saini 2015年

3
像Chrome这样的浏览器已开始被弃用sha1。替换-a sha512并考虑添加-len 2048第二次makecert调用,一切都应该很好。
— O. Jones

2
请注意,这在Windows 10中似乎不再起作用(至少如上所示)。我不得不改用PowerShell cmdlet,该命令没有任何问题。
— DVK

119

使用PowerShell

从Windows 8.1和Windows Server 2012 R2(Windows PowerShell 4.0)及更高版本,可以使用新New-SelfSignedCertificatecmdlet 创建自签名证书:

例子:

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

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

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

使用IIS管理器

  1. 启动IIS管理器
  2. 在服务器级别的IIS下,选择“服务器证书”
  3. 在“操作”下的右侧,选择“创建自签名证书”
  4. 如果显示“为证书指定友好名称”,请键入适当的名称以供参考。
    1. 示例:www.domain.com或subdomain.domain.com
  5. 然后,从左侧列表中选择您的网站
  6. 在“动作”下的右侧,选择“绑定”
  7. 添加一个新的HTTPS绑定并选择您刚刚创建的证书(如果您的证书是通配符证书,则需要指定主机名)
  8. 单击确定并对其进行测试。

7
+1为PowerShell解决方案。快速简便,然后,新证书显示在我的IIS管理器>连接>站点> [我的应用程序]>编辑绑定>编辑> SSL证书下拉列表中。
— 乔恩·施耐德

3
按照上述说明操作,然后查看证书,说明没有填充CN字段,该字段仍必须为本地主机名。
— daveD

7
究竟。错了!“友好名称”与CN无关。我不知道为什么这个答案有这么多投票?
— c00000fd 2015年

25
因为Powershell方法确实有效,所以这很不愉快。(请参阅@DivineOps答案)这是我使用的命令:New-SelfSignedCertificate -FriendlyName *.mydomain.local -DnsName *.mydomain.local, localhost -CertStoreLocation Cert:\LocalMachine\My这将在个人存储中创建一个证书。然后,我首先将证书导出到文件,然后通过IIS管理器将其重新导入到IIS(以将其用于我的https绑定),然后通过MMC导入到受信任的根CA(以避免浏览器警告)。
— 安东

3
该-NotAfter选项还可以方便地指定到期日期(不指定到期日期,默认值为1年)。我使用的示例New-SelfSignedCertificate -DnsName *.mydomain.com -FriendlyName *.mydomain.com -NotAfter (Get-Date).AddYears(15) -CertStoreLocation cert:\LocalMachine\My
— Ben Amada

52

要为您的特定域创建新证书:

以管理员身份打开Powershell ISE,运行命令:

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

要信任新证书:

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

要将证书绑定到您的站点:

  • 打开IIS管理器
  • 选择您的站点,然后在右窗格中选择“编辑站点->绑定”。
  • 添加具有正确主机名和新证书的新https绑定

2
这只能在Windows 8.1和Windows Server 2012 R2(Windows PowerShell 4.0)或更高版本中使用,尽管您可以在其中一个操作系统中生成证书,然后将其导入到另一台计算机中(我已经这样做过,可以将此证书与SSRS一起使用安装在Windows Server 2008 R2中)。
— mprost

2
除了将其复制到“受信任的根证书颁发机构”中的“导出和导入”之外,您只需复制并粘贴
— jk7 '18

复制/粘贴仅可在同一服务器上使用。您也可以ctrl将证书从“个人”文件夹拖动到同一服务器上的“受信任的根证书颁发机构”。如果希望其他主机能够在没有警告的情况下访问该站点,则需要将其导出并将其导入证书到其本地TRCA中(不需要包括私钥)。
— jessewolfe

40

我不得不通过结合给定答案和更多资源中的点点滴滴来迷惑Windows上的自签名证书。这是我自己的(并且希望是完整的)演练。希望它将为您节省一些我自己的痛苦学习曲线。它还包含有关主题的信息,这些信息迟早会在您创建自己的证书时弹出。

在Windows 10及更低版本上创建自签名证书

不要使用makecert.exe。它已被Microsoft弃用。
现代方式使用Powershell命令。

Windows 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证书存储,并且仅在为它添加例外时才会信任该证书。该按钮位于警告的正下方。

证书的名称无效...

此警告表明您做错了什么。证书的(通配符)域与您的网站域不匹配。必须通过更改网站的(子)域或颁发匹配的新证书来解决该问题。实际上,即使证书不匹配,您也可以在FF中添加一个例外,但是使用这种组合,您将永远不会在Chrome中看到绿色的挂锁符号。

Firefox可以在此位置显示许多其他不错且易于理解的证书警告,例如过期的证书,带有过时签名算法的证书等。

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

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

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

原因很简单:作为通配符域,它是非法的。
通配符证书必须至少包含第二级域名。

因此,表单的域*.local非常适合开发HTTP网站。但是对于HTTPS来说却不是那么多,因为您将不得不为启动的每个新项目颁发新的匹配证书。

重要注意事项:

  • 有效的主机域只能包含字母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/


2
我想在这里指出,第一个DNS名称也保存为使用者名称,您可能不想将其用作通配符。
— 本·塞沃斯

@BenSewards:Ben,谢谢你指出这一点。我已经更新了答案,以包括主题/ SAN字段详细信息。在主题字段而不是SAN字段中使用通配符主机名是否看到任何问题?
— Jpsy

@Jpsy-这对我在创建自签名证书的服务器上本地有效,但不适用于我(客户端)计算机上的Firefox或Chrome。appname.dev has a security policy called HTTP Strict Transport Security (HSTS), which means that Firefox can only connect to it securely. You can’t add an exception to visit this site.正如我所指出的,我明白,它不允许您添加客户端异常,这与您的指令相反。相对于SSL设置,“需要SSL”和“客户端证书”选项,IIS自身内部的配置是否错误?
— Code Maverick

@CodeMaverick:您的问题中是否可能包含某些广告拦截程序或防病毒软件?另一个选择可能是证书与您使用的域名不匹配。请记住,证书的CN或SAN中的*只能代表域名中的一个网段(不包含任何点)。因此,CN *.mydomain.com可以是有效证书,me.mydomain.com但不能是me.at.mydomain.com。
— Jpsy

14

当我想对IIS 8上托管的项目启用SSL时,我遇到了同样的问题。最后,我使用的工具是OpenSSL,与makecert命令战斗了许多天。证书是在Debian中生成的,但是我可以无缝地将其导入到IIS 7和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。
    • 单击文件。
    • 选择添加/删除管理单元...。
    • 双击证书。
    • 选择计算机帐户,然后选择下一步->。
    • 选择本地计算机并完成。
    • 好吧。
    • 转到证书 -> 受信任的根证书颁发机构 -> 证书,严格单击证书,然后选择所有任务 -> 导入 ...

在此处输入图片说明

  • 选择下一步 -> 浏览...
  • 您必须选择“ 所有文件”才能浏览root-cacert.pem文件的位置。
  • 单击下一步,然后选择将所有证书放入以下存储:受信任的根证书颁发机构。
  • 单击下一步,然后单击完成。

在此处输入图片说明

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

  1. 在最后一步中,我们将证书导入IIS并添加绑定站点。

    • 打开Internet信息服务(IIS)管理器,或在命令提示符下键入inetmgr并转到“ 服务器证书”。
    • 单击导入...。
    • 设置.pfx文件的路径,密码短语并选择Web Hosting上的证书存储。

在此处输入图片说明

  • 单击确定。
  • 现在转到IIS管理器上的站点,然后选择“ 绑定...”并添加一个新的绑定。

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

  • 单击“ 确定”,一切完成。

在此处输入图片说明


我希望使用自签名证书的有效期更长,并且Windows主机上没有带makecert.exe的Windows SDK。Linux主机,此答案提供了解决方案。
— 里奇

很高兴您发现我的回答有用。
— 约瑟夫

在哪里将“ public.organization.com”放入openssl命令?
— 在一个

2

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

在IIS管理器中

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

现在,在您的IIS网站上...

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

在此处输入图片说明


感谢到目前为止最有用的答案。至少在开发中使用它是快速的。
— cabaji99

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.