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


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.comsubdomain.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.