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

时间:2013-10-18 03:35:29

标签: iis ssl certificate ssl-certificate self-signed

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

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

我已尝试按http://technet.microsoft.com/en-us/library/cc753127(v=ws.10).aspx中所述创建自签名证书,但此证书仅适用于localhost。此证书可以用于我的目的还是我必须为我的开发子域创建自签名?如果我必须为我的开发子域创建自签名证书,我可以使用哪种实用程序或在线服务(免费)?

7 个答案:

答案 0 :(得分:125)

我添加此信息是因为接受的答案似乎没有完全解决问题,或者至少没有为我解决问题。

使用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

的精彩博客文章中对此解决方案的所有荣誉

答案 1 :(得分:108)

使用PowerShell

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

示例:

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. 下的右侧
  8. 添加新的HTTPS绑定并选择刚刚创建的证书(如果您的证书是通配符证书,则需要指定主机名)
  9. 单击“确定”并进行测试。

答案 2 :(得分:44)

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

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

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

信任新证书:

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

将证书绑定到您的网站:

  • 打开IIS管理器
  • 选择您的网站,然后选择修改网站 - >右窗格中的绑定
  • 使用正确的主机名和新证书添加新的https绑定

答案 3 :(得分:21)

我不得不通过结合给定答案和更多资源中的点点滴滴来迷惑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

生成的证书

以上两个命令均为域localhost*.dev.local创建证书。
Win10版本的有效时间为15年,显示名称为“ Dev Cert * .dev.local,dev.local,localhost”。

更新:如果您在参数-DnsName中提供了多个主机名条目(如上所示),则这些条目中的第一个将成为域的使用者(AKA通用名称)。所有主机名条目的完整列表将存储在证书的“主题备用名称”(SAN)中。 (感谢@BenSewards指出这一点。)

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

信任证书

新证书不是任何信任链的一部分,因此,任何浏览器都不认为它是可信任的。要更改此设置,我们会将证书复制到您计算机上受信任的根CA的证书存储中:

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

从您的个人商店中导出证书

在左列中选择“证书(本地计算机)/个人/证书”。
查找新创建的证书(在Win 10中,“友好名称”列可能会有所帮助)。
右键单击此证书→所有任务→导出...→下一步→选择“否,不导出私钥”→下一步→选择“ DER编码...”→下一步→输入文件名并保存。

提示:我们故意不使用PFX文件格式进行导出。它将您的私钥包含在导出文件中,并且您通常不希望私钥放到任何地方!

将证书导入到“受信任的根CA”存储中

在左列中,右键单击“证书(本地计算机)/受信任的根CA /证书”→“所有任务”→“导入...”→“下一步”→选择刚导出的文件→“下一步”→“将所有证书放入以下存储:“受信任的根CA””→“下一步”→“完成”。

在ISS中使用

现在,您可以转到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的问题

这实际上与自签名证书无关,但仍与整个过程有关:
完成上述步骤后,打开myname.dev.local时Edge可能不会显示任何内容。
原因是Windows 10 for Modern Apps的网络管理的一个特征,称为“网络隔离”。

要解决该问题,请以管理员权限打开命令提示符,然后输入以下命令一次:

CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe

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

答案 4 :(得分:14)

当我想为IIS 8上托管的项目启用SSL时,我遇到了同样的问题。最后,我使用的工具是OpenSSL,经过多天与 makecert 命令的斗争。证书是在Debian中生成的,但我可以将它无缝地导入到IIS 7和8中。

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

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

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

  1. openssl req -new -x509 -days 3650 -extensions v3_ca -keyout root-cakey.pem -out root-cacert.pem -newkey rsa:4096
  2. 您可以使用以下默认设置创建配置文件: 现在我们将生成证书请求,该证书请求是发送给证书颁发机构的文件。

    必须将公用名设置为您网站的域名,例如: public.organization.com

    1. openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:4096
    2. 现在,证书请求已使用生成的CA证书进行签名。

      1. openssl x509 -req -days 365 -CA root-cacert.pem -CAkey root-cakey.pem -CAcreateserial -in server-csr.pem -out server-cert.pem
      2. 必须将生成的证书导出到可以导入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"
        2. 在此步骤中,我们将导入证书CA.

          1. 在您的服务器中,必须将CA证书导入受信任的根证书颁发机构,因为IIS可以信任要导入的证书。请记住,要导入IIS的证书已使用CA的证书进行签名。

            • 打开命令提示符并键入 mmc
            • 点击文件
            • 选择添加/删除管理单元...
            • 双击证书
            • 选择计算机帐户下一步 - >
            • 选择本地计算机完成
            • 确定即可。
            • 转到证书 - > 受信任的根证书颁发机构 - > 证书,点击证书并选择所有任务 - > 导入 ...
          2. enter image description here

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

            enter image description here

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

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

              • 在命令提示符下打开 Internet信息服务(IIS)管理器或键入 inetmgr ,然后转到服务器证书
              • 点击导入...
              • 虚拟主机上设置.pfx文件,密码和选择证书存储的路径。
            2. enter image description here

              • 点击确定
              • 现在转到IIS管理器上的站点并选择绑定... 添加新绑定。

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

              • 点击确定,一切都已完成。

              enter image description here

答案 5 :(得分:2)

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

在IIS管理器中

  1. 点击计算机名称节点
  2. 打开服务器证书
  3. 在“动作”面板中,选择“创建自签名证书”
  4. 在'指定友好名称...'中将其命名为* Dev(从类型列表中选择'个人')
  5. 保存
  6. 现在,在您的IIS网站上......

    1. 管理绑定
    2. 为Https
    3. 创建新绑定
    4. 从列表中选择自签名证书
    5. 选择后,域名框将变为启用状态,您将能够输入您的域名。
    6. enter image description here

答案 6 :(得分:0)

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

Jexus Manager

  1. 在“连接”面板中选择服务器节点。
  2. 在中间面板中,单击“服务器证书”图标以打开管理页面。
  3. 在“动作”面板下,单击“生成自签名证书...”菜单项。
  4. https://www.jexusmanager.com/en/latest/tutorials/self-signed.html