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

Moi*_*ala 116 iis ssl certificate self-signed ssl-certificate

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

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

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

jlm*_*lmt 130

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

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

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

C:\Program Files\Microsoft.Net\SDK\v2.0 64bit\Bin\makecert.exe
Run Code Online (Sandbox Code Playgroud)

您可以创建签名授权机构并将其存储在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
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建绑定到子域并由新权限签名的证书:

(请注意,-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
Run Code Online (Sandbox Code Playgroud)

然后,您的证书应出现在IIS管理器中,以便绑定到您的站点,如Tom Hall的帖子中所述.

Mike O'Brien在http://www.mikeobrien.net/blog/creating-self-signed-wildcard上发表的精彩博客文章对此解决方案的所有荣誉

  • 我能够做到这一点.我不得不使用Visual Studio 2010命令提示符来"makecert.exe"进入我的路径.对于证书,我认为我会更安全,并使用`-a SHA512 -len 8192` - 它需要永远生成.正如我所怀疑的那样,它对IIS使用的加密级别没有任何影响.默认情况下IIS使用128位,你必须做[组策略的东西](http://this-world-is.boldlygoingnowhere.org/andinet/wordpress/index.php/2013/08/256-bit-ssl- with-iis7 /)来改变这个.对其他读者的进一步说明:不要在`-eku`之后改变幻数,它们是必需的. (8认同)
  • 像Chrome这样的浏览器已经开始弃用`sha1`.替换`-a sha512`并考虑将`-len 2048`添加到第二个`makecert`调用中,所有这些都应该很好. (3认同)
  • 使用管理权限从命令提示符运行以上所有命令,否则您将收到"错误:保存编码的证书以存储失败=> 0x5"消息. (2认同)
  • 请注意,这在Windows 10中似乎不再起作用(至少如上所示)。我不得不改用PowerShell cmdlet,该命令没有任何问题。 (2认同)

Tom*_*all 111

使用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
Run Code Online (Sandbox Code Playgroud)

使用IIS管理器

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

  • 这得到了投票,因为Powershell方法确实有效.(请参阅@DivineOps答案)以下是我使用的命令:`New-SelfSignedCertificate -FriendlyName*.mydomain.local -DnsName*.mydomain.local,localhost -CertStoreLocation Cert:\ LocalMachine\My`这将在个人存储中创建一个证书.然后,我首先将证书导出到一个文件,然后通过IIS管理器将其重新导入IIS(用于我的https绑定),然后通过MMC重新导入到受信任的根CA(以避免浏览器警告). (22认同)
  • 究竟.这是错的!"友好的名字"与CN无关.我不知道为什么这个答案有这么多的赞成? (7认同)
  • 适用于PowerShell解决方案的+1.快速简便,在此之后,新证书出现在我的IIS管理器>连接>站点> [我的应用程序]>编辑绑定>编辑> SSL证书下拉列表中. (6认同)
  • 按照上面的说明,然后查看证书,说明没有填充CN字段,仍然需要localhost名称. (3认同)
  • 我还必须将证书添加到 Windows 8.1 上的受信任根证书颁发机构存储中。我遵循了以下说明:http://www.dell.com/support/article/us/en/19/SLN156440/EN (2认同)
  • `-NotAfter`选项也可以方便地指定到期日期(没有它,默认只有1年).示例我使用了`New-SelfSignedCertificate -DnsName*.mydomain.com -FriendlyName*.mydomain.com -otAfter(Get-Date).AddYears(15)-CertStoreLocation cert:\ LocalMachine\My` (2认同)

Div*_*Ops 50

要为特定域创建新证书,请执行以下操作:

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

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

信任新证书:

打开mmc.exe

转到控制台根目录 - >证书(本地计算机) - >个人

选择您创建的证书,右键单击 - >所有任务 - >导出,然后按照导出向导创建.pfx文件

转到控制台根目录 - >证书 - >受信任的根证书颁发机构并导入新的.pfx文件

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

打开IIS管理器

选择您的站点,然后在右侧窗格中选择"编辑站点" - >"绑定"

使用正确的主机名和新证书添加新的https绑定

  • 而不是导出和导入将其复制到受信任的根证书颁发机构,您只需复制和粘贴 (4认同)
  • 这仅适用于Windows 8.1和Windows Server 2012 R2(Windows PowerShell 4.0)或更高版本,但您可以在其中一个操作系统中生成证书并稍后将其导入另一台计算机(我刚刚将此证书与SSRS一起使用)安装在Windows Server 2008 R2中). (2认同)

Jps*_*psy 29

我不得不通过组合来自给定答案和更多资源的点点滴滴来解决Windows上的自签名证书.这是我自己的(希望是完整的)演练.希望它能省去你一些痛苦的学习曲线.它还包含相关主题的信息,这些信息将在您创建自己的证书时迟早弹出.

在Windows 10上创建自签名证书

不要使用makecert.exe.它已被微软弃用.
现代方式使用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)
Run Code Online (Sandbox Code Playgroud)

Windows 8,Windows Server 2012 R2:

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

New-SelfSignedCertificate  -DnsName "*.dev.local", "dev.local", "localhost"  -CertStoreLocation cert:\LocalMachine\My
Run Code Online (Sandbox Code Playgroud)

结果证书

上述两个命令创建用于域的证书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文件格式进行导出.它会将您的私钥包含在导出文件中,并且您通常不希望您的私钥转到任何地方!

将您的证书导入受信任的根CAs商店

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

在国际空间站使用

现在您可以转到IIS管理器,选择本地网站的绑定→添加→https→输入表单的主机名 myname.dev.local(您的证书仅对其有效*.dev.local)并选择新证书→确定.

添加到主机

还要将主机名添加到C:\ Windows\System32\drivers\etc\hosts:

127.0.0.1  myname.dev.local
Run Code Online (Sandbox Code Playgroud)

快乐

现在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 for Modern Apps的网络管理的一个特征,称为"网络隔离".

要解决该问题,请使用管理员权限打开命令提示符并输入以下命令:

CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe
Run Code Online (Sandbox Code Playgroud)

有关Edge和网络隔离的更多信息,请访问:https: //blogs.msdn.microsoft.com/msgulfcommunity/2015/07/01/how-to-debug-localhost-on-microsoft-edge/

  • 我想在这里指出,第一个DNS名称也保存为使用者名称,您可能不想将其用作通配符。 (2认同)

Jos*_*eph 15

当我想为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文件的位置.
  • 单击" 下一步",然后选择" 将所有证书放在以下存储中:受信任的根证书颁发机构".
  • 单击NextFinish.

在此输入图像描述

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

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

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

在此输入图像描述

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

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

  • 单击" 确定",完成所有操作.

在此输入图像描述