如何为本地主机创建自签名证书?

212

你是否将证书安装为CA? - vcsjones
我按照在Win7下将自签名证书安装到IIS的过程进行了操作。但是这样创建的证书是针对“mymachinename”的,而我需要一个针对“localhost”的证书。 - chris
1
你好!考虑将Auri的回答设置为主要答案,因为makecert已被弃用。答案链接:https://dev59.com/UWsz5IYBdhLWcg3wADS6#44164653 - Tormod Haugene
在此处描述了Win / OSX的过程:https://alfilatov.com/posts/how-to-create-self-signed-certificate/ - Alex Filatov
1
对于谷歌搜索用户,请前往 https://dev59.com/PGsz5IYBdhLWcg3w6MNS#57511038。简而言之:在您的操作系统上使用 mkcert 获取一个好的证书并进行安装。 - koppor
13个回答

178

由于这个问题标记了IIS,我找不到一个好的答案来获取可信证书,所以我会发表我的意见:

首先,在管理员PowerShell中使用@AuriRahimzadeh的命令:

New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(100)

将证书的有效期限增加到100年,这样本地主机的证书就不会过期了。如果您想要24个月或其他任何值,可以使用-NotAfter (Get-Date).AddMonths(24)

这很好,但是证书不受信任,会导致以下错误。这是因为它未安装在“Trusted Root Certification Authorities”中。

enter image description here

通过启动mmc.exe来解决此问题。

然后转到:

文件 -> 添加或删除单独管理器 -> 证书 -> 添加 -> 计算机帐户 -> 本地计算机。点击完成。

展开“个人”文件夹,您将看到自己的“localhost”证书:

enter image description here

将证书复制到“Trusted Root Certification Authorities - Certificates”文件夹中。

最后一步是打开Internet Information Services(IIS)管理器或简单的inetmgr.exe。从那里转到您的站点,选择“绑定...”和“添加...”或“编辑...”。设置https并从下拉列表中选择您的证书。

enter image description here

现在您的证书是受信任的:

enter image description here


14
这应该是被采纳的答案!它有效!如果你在本地主机和受信任证书上搞砸了,一定要删除所有旧的本地主机证书(通过mmc控制台和IIS(顶级管理服务器))。 - Tuan Jinn
非常好的答案,并且在IIS上运行良好,作为2020年的最新版本。非常感谢! - alessandrocb
1
只要我刷新“证书”文件夹,证书就会被删除。 - nathanjw
@philw,你能提供更多有关导出/删除/导入的详细信息吗?我上周升级到了Windows 11,自那以后,我的本地应用程序实例就没有提示我使用CAC。我尝试创建新证书并将它们添加到受信任的根存储区,但对我来说这并没有起作用。 - Levi Wallach
3
如果您不想在1年后重复所有这些步骤,可以使用“-NotAfter”选项创建一个证书,该证书将在更多的年份后过期。例如:New-SelfSignedCertificate -DnsName“localhost” -CertStoreLocation“cert:\LocalMachine\My” -NotAfter“31/12/2199” - Luca Ritossa
显示剩余5条评论

104

尽管此帖子标记为 Windows,但这是关于 OS X 的相关问题,我在其他地方没有看到答案。以下是在 OS X 上为本地主机创建自签名证书的步骤:

# Use 'localhost' for the 'Common name'
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -days 365 -keyout localhost.key -out localhost.crt

# Add the cert to your keychain
open localhost.crt
Keychain Access 中,双击此新的本地主机证书。展开“信任”旁边的箭头,并选择“始终信任”。现在,Chrome 和 Safari 应该信任这个证书。例如,如果您想在 node.js 中使用此证书:
var options = {
    key: fs.readFileSync('/path/to/localhost.key').toString(),
    cert: fs.readFileSync('/path/to/localhost.crt').toString(),
    ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384',
    honorCipherOrder: true,
    secureProtocol: 'TLSv1_2_method'
};

var server = require('https').createServer(options, app);

2
第一个命令 ssh-keygen 是不必要的,因为 openssl 命令也会创建一个新的密钥(并覆盖 ssh 创建的密钥)。 - Félix Saparelli
8
您可以通过向 "openssl" 参数添加“-subj '/CN=localhost'”来完全自动化该过程。 - Félix Saparelli
8
要让 OS X 在命令行中信任它,而不是四处点击,可以执行以下操作:sudo security add-trusted-cert -p ssl -d -r trustRoot -k ~/Library/Keychains/login.keychain localhost.crt - philfreo
3
同样适用于Linux。非常感谢。 - Marcel
1
我按照所有步骤操作,但在Chrome 60中出现了“ERR_SSL_VERSION_OR_CIPHER_MISMATCH”错误,Safari 10.1.2也无法正常工作。 - styfle
显示剩余3条评论

61

这应该是2017年的答案。 - Tormod Haugene
1
对于那些跟随但不知道如何安装生成的证书的人,请按照此视频中的步骤进行操作,这对我很有效! https://www.youtube.com/watch?v=y4uKPUFmSZ0 - Eric Brown - Cal
9
密钥和证书文件存储在哪里? - woojoo666
1
通过使用 -KeyLocation 标志,您可以指定位置。@woojoo666 - hamid
1
这个回答很有用,但不完整,因为证书无法被信任。请查看其他关于将其添加为受信任机构的答案。 - BurnsBA
4
New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My" -KeyLocation "c:\users\mad\certs" 在指定目录中未生成任何文件。 (说明:该命令是在Windows操作系统下使用PowerShell运行的,用于创建一个自签名证书并将其存储在本地计算机的“个人”证书存储区中,并将私钥导出到指定目录。) - Marc

46
经过花费大量时间研究该问题后,我发现当我按照使用IIS制作自签名证书的建议时,我发现发行人和颁发给的信息并不正确。SelfSSL.exe 是解决此问题的关键。以下网站不仅提供了一步一步制作自签名证书的方法,还解决了颁发人和颁发给的问题。 这里是我找到的最佳自签名证书制作解决方案。如果你想以视频形式查看相同的教程,请点击这里
使用 SelfSSL 的示例如下:

SelfSSL /N:CN=YourWebsite.com /V:1000 /S:2

SelfSSL /?

将提供带有说明的参数清单。

RobBagby.com 的这篇文章对我非常有帮助,Henry 很棒能找到这篇文章。 - cymorg
MEGA!那个视频质量很差,但是包含了所有需要的内容。 - tonco
2
robbagby网站的链接已失效。请查看我的答案,其中包含CodeCowboyOrg提供的两个高质量的YouTube教程。 - Moses Machua
编辑了答案并链接到robbagby.com上的Wayback存档文章。 - Hashim Aziz

23

2
我的证书去哪了 :o 它不在 C:\Windows\system32 目录下。 - EaterOfCode
2
顺便提一下,makecert.exe工具是通过Visual Studio命令提示符使用的,供未来读者参考。您还可以使用Internet Information Services(IIS)资源工具包并安装SelfSSL 1.0。http://www.microsoft.com/downloads/en/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en - atconway
3
快速回答虽然很好,但并不总是有帮助。在IIS7中,我看到的错误是“证书不能用作SSL服务器证书”。提问者还提到了浏览器警告,而不是“如何创建证书”? - cmroanirgo
1
eku 是用于代码签名的,如果您想要 SSL 证书,需要使用 eku 1.3.6.1.5.5.7.3.1。个人建议使用 -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.3,这将为您提供客户端认证、服务器认证和代码签名。 - Scott Chamberlain
1
@EaterOfCode 我的在 C:\Windows\SysWOW64。 - jcs
显示剩余2条评论

10

1
在尝试了各种PowerShell“魔法”和其他无效方法后,Pluralsight的工具在30秒内为我生成了一个可用的脚本,这还包括吃披萨的时间(我是说下载和提取工具的时间)。由于我仍在这台旧笔记本电脑上运行Windows 7,所以这对我来说是完美的解决方案,谢谢! - Ade

7

生成本地主机证书的最快方式。

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

在第3行第53个字符处:
  • -subj '/CN=localhost' -extensions EXT -config <( \
  • ~
表达式中缺少闭合的括号。删除括号也不起作用。
- nickornotto

3
是和不是。自签名证书会导致出现警告信息,因为该证书并未由受信任的证书颁发机构签名。您可以考虑一些选项来消除本地计算机上的此警告。请参考以下问题的排名最高的答案以获取详细信息:如何才能使Internet Explorer 8接受自签名证书?希望能对您有所帮助!
编辑:抱歉,我起初并不知道您被限制在本地主机上。您可以尝试按照以下链接中的说明“生成具有正确通用名称的自签名证书”。http://www.sslshopper.com/article-how-to-create-a-self-signed-certificate-in-iis-7.html

不,警告信息出现是因为URL(https://localhost)与证书名称不匹配,该证书是在机器名称下颁发的。如果我切换到https://mymachinename,那么就不会出现错误。不幸的是,由于某些原因,我必须使用localhost而不是机器名称,这与问题无关。 - chris

2
在局域网(Local Area Network)中,我们有一台名为xhost的运行Windows 10操作系统并启用IIS作为Web服务器的服务器计算机。我们必须通过浏览器(如Google Chrome)访问此计算机,不仅可以从服务器本身的localhost通过https://localhost/访问,还可以通过LAN中其他主机的URL https://xhost/ 进行访问。

https://localhost/
https://xhost/
https://xhost.local/
...

通过这种访问方式,我们没有完全合格的域名,只有本地计算机名称xhost。
或者从广域网(WAN)上访问:

https://dev.example.org/
...

您应该将xhost替换为您真实的本地计算机名称。
以上解决方案都可能不能满足我们的需求。经过多天的尝试,我们采用了openssl.exe解决方案。我们使用了2个证书 - 一个是CA(自认证机构证书)RootCA.crt,另一个是由前者认证的xhost.crt。我们使用PowerShell。

1. 创建并切换到一个安全目录:

cd C:\users\so\crt

2. 生成自签名的证书颁发机构 RootCA.pem、RootCA.key 和 RootCA.crt:


openssl req -x509 -nodes -new -sha256 -days 10240 -newkey rsa:2048 -keyout RootCA.key -out RootCA.pem -subj "/C=ZA/CN=RootCA-CA"
openssl x509 -outform pem -in RootCA.pem -out RootCA.crt

3. 请求认证:xhost.key、xhost.csr。
C: Country
ST: State
L: locality (city)
O: Organization Name
Organization Unit
CN: Common Name

    


openssl req -new -nodes -newkey rsa:2048 -keyout xhost.key -out xhost.csr -subj "/C=ZA/ST=FREE STATE/L=Golden Gate Highlands National Park/O=WWF4ME/OU=xhost.home/CN=xhost.local"

4. 使用RootCA.pem对xhost.crt进行认证:


openssl x509 -req -sha256 -days 1024 -in xhost.csr -CA RootCA.pem -CAkey RootCA.key -CAcreateserial -extfile domains.ext -out xhost.crt

使用extfile domains.ext文件定义了许多安全访问服务器网站的方式:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = xhost
DNS.3 = xhost.local
DNS.4 = dev.example.org
DNS.5 = 192.168.1.2

5. 将xhost.pfx转换成PKCS#12格式

将私有密钥xhost.key和证书xhost.crt合并,以便导入到iis中。此步骤需要输入密码,请按[RETURN]键留空(不输入密码):


openssl pkcs12 -export -out xhost.pfx -inkey xhost.key -in xhost.crt

6. 在IIS10中导入xhost.pfx证书

在xhost计算机(这里是本地主机)安装证书。然后重新启动IIS服务。

IIS10 Gestionnaire des services Internet (IIS) (%windir%\system32\inetsrv\InetMgr.exe)

enter image description here

enter image description here

7. 在端口443上使用xhost.local证书绑定SSL。

enter image description here

重新启动IIS服务。
8. 将RootCA.crt导入到“受信任的根证书颁发机构”中,可以通过在任何访问网站https://xhost/的计算机上使用Google Chrome完成。
路径如下:\Google Chrome/…/设置/[高级]/隐私和安全/安全/管理证书。
导入RootCA.crt。

enter image description here

浏览器将显示此有效证书树:

RootCA-CA
  |_____ xhost.local

enter image description here

在局域网内,甚至通过 https://dev.example.org 的广域网访问,也不会出现证书错误。

enter image description here

这里是整个 Powershell 脚本文件 socrt.ps1,可以从头开始生成所有所需的证书文件:

#
# Generate:
#   RootCA.pem, RootCA.key RootCA.crt
#
#   xhost.key xhost.csr xhost.crt
#   xhost.pfx
#
# created  15-EEC-2020
# modified 15-DEC-2020
#
#
# change to a safe directory:
#

cd C:\users\so\crt

#
# Generate RootCA.pem, RootCA.key & RootCA.crt as Certification Authority:
#
openssl req -x509 -nodes -new -sha256 -days 10240 -newkey rsa:2048 -keyout RootCA.key -out RootCA.pem -subj "/C=ZA/CN=RootCA-CA"
openssl x509 -outform pem -in RootCA.pem -out RootCA.crt

#
# get RootCA.pfx: permitting to import into iis10: not required.
#
#openssl pkcs12 -export -out RootCA.pfx -inkey RootCA.key -in RootCA.crt

#
# get xhost.key xhost.csr:
#   C: Country
#   ST: State
#   L: locality (city)
#   O: Organization Name
#   OU: Organization Unit
#   CN: Common Name
#
openssl req -new -nodes -newkey rsa:2048 -keyout xhost.key -out xhost.csr -subj "/C=ZA/ST=FREE STATE/L=Golden Gate Highlands National Park/O=WWF4ME/OU=xhost.home/CN=xhost.local"

#
# get xhost.crt certified by RootCA.pem:
# to show content:
#   openssl x509 -in xhost.crt -noout -text
#
openssl x509 -req -sha256 -days 1024 -in xhost.csr -CA RootCA.pem -CAkey RootCA.key -CAcreateserial -extfile domains.ext -out xhost.crt

#
# get xhost.pfx, permitting to import into iis:
#
openssl pkcs12 -export -out xhost.pfx -inkey xhost.key -in xhost.crt

#
# import xhost.pfx in iis10 installed in xhost computer (here localhost).
#

安装Windows版的openSSL,请访问https://slproweb.com/products/Win32OpenSSL.html

1

以下是我在 Windows 上获取本地主机有效证书所做的步骤:

  1. 下载 mkcert 可执行文件(https://github.com/FiloSottile/mkcert/releases),并将其重命名为 mkcert.exe
  2. 运行 "mkcert -install"
  3. 打开 Windows 证书管理器 (certmgr.msc)
  4. 右键单击“受信任的根证书颁发机构” -> 导入
  5. 从 C:\Users[用户名]\AppData\Local\mkcert\导入根证书 (rootCA.pem)
  6. 为指定的域名创建 *.p12 证书:"mkcert -pkcs12 [name1] [name2]"
  7. 将 *.p12 证书重命名为 *.pfx
  8. 在 IIS 中 -> 服务器证书 -> 导入 (pfx),并放入“个人”组[默认密码:“changeit”]
  9. 将证书分配给默认网站(绑定 -> https(443)-> 修改 -> SSL 证书)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接