让 Chrome 接受自签名的 localhost 证书 [已关闭]

Getting Chrome to accept self-signed localhost certificate [closed]

提问人:pjohansson 提问时间:9/28/2011 最后编辑:yanet.moralesrpjohansson 更新时间:11/14/2023 访问量:1802695

问:


这个问题似乎不是关于特定的编程问题、软件算法或程序员主要使用的软件工具。如果您认为该问题在另一个 Stack Exchange 站点上是主题,您可以发表评论以解释该问题可能在哪里得到回答。

2个月前关闭。

社区在 2 个月前审查了是否重新讨论这个问题,并将其关闭:

原始关闭原因未解决

我已经为 localhost CN 创建了一个自签名 SSL 证书。正如预期的那样,Firefox 在最初抱怨它后接受了它。但是,Chrome 和 IE 拒绝接受它,即使将证书添加到“受信任的根”下的系统证书存储中也是如此。即使当我在 Chrome 的 HTTPS 弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚持认为该证书不可信。

我应该怎么做才能让 Chrome 接受证书并停止抱怨?

Google-Chrome SSL 证书 自签名

评论

17赞 starskythehutch 9/28/2011
当你说Firefox最初抱怨它时,你的意思是它要求你添加证书例外吗?如果证书安装正确,则不会发生这种情况。在我看来,所有三个浏览器都在抱怨,但Firefox允许您取消其投诉。我将其作为评论发布,因为我没有具体的答案,但我已经做到了这一点,并且在所有三个浏览器中都运行良好。我建议你先尝试让它在IE上运行,然后一旦它很高兴,就担心其他两个。对不起,我帮不上什么忙!
6赞 curiousguy 8/9/2015
Firefox 使用系统证书存储。
6赞 Seldom 'Where's Monica' Needy 4/26/2017
如果您的证书签名使用 SHA-1,则即使您已成功添加自定义证书,最新版本的 Chrome(大约 57 版)也会显示警告。无论如何,开发人员工具的“安全”面板将更具体地说明问题所在,例如: .net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM
9赞 GTodorov 9/20/2018
我刚刚停止将 Chrome 用于开发目的,因为它对开发人员不友好。通常,最终陷入这种情况的人无论如何都知道自己在做什么。谢谢,但不谢谢。我对 Chrome 已经受够了挫败感!
8赞 DerpyNerd 3/18/2021
2021 年,仍然没有简单的方法将 localhost 或任何 IP 标记为安全。来吧......谷歌正在放弃照片中的无限存储空间。广告像以前一样更多地出现在你的脸上,广告拦截器已经变得毫无用处。根据您查找的内容,搜索结果似乎是“受谴责”的。回顾一下,也许是时候减少使用谷歌的生态系统了?是的!

答:

15赞 Ira Rainey 9/28/2011 #1

您确定提供站点的地址与证书相同吗?我在使用 Chrome 和自签名证书时遇到了同样的问题,但最终我发现它对证书上的域名验证非常挑剔(应该如此)。

Chrome 没有自己的证书存储,而是使用 Window 自己的证书存储。但是,Chrome 无法将证书导入商店,因此您应该改为通过 IE 添加证书。

在 Google Chrome 中安装证书

在 Internet Explorer 中安装证书

此外,请查看此内容,了解创建自签名证书的几种不同方法(我假设您正在使用 IIS,因为您没有提到)。

如何在 IIS 7 中创建自签名证书

评论

0赞 pjohansson 9/28/2011
有问题的站点是 localhost,证书的 CN 是“localhost”。是的,我确实在 Windows 的证书存储中安装了证书。IE 和 Chrome 都抱怨证书。
0赞 Ira Rainey 9/28/2011
不确定您使用的是 IIS 还是 Apache,但请检查我刚刚添加的有关为 IIS 创建自签名证书的额外链接。
0赞 BairDev 7/18/2019
由于对证书部分的域名验证非常挑剔:有人对此了解得更多吗?我在 Android 9 上有一个问题(是 2019 年),带有根证书,被 Google Chrome 指责为不安全。FF和桌面上都可以。
0赞 infiniteshi 7/15/2022
“你确定网站提供的地址与证书相同吗?” - 好问题,我怎么知道?
154赞 bjnord 10/31/2011 #2

在 Mac 上,您可以使用“钥匙串访问”实用工具将自签名证书添加到系统钥匙串,然后 Chrome 将接受该证书。我在这里找到了分步说明:

Google Chrome、Mac OS X 和自签名 SSL 证书

基本上:

  1. 双击带有 X 的锁定图标,然后将证书图标拖放到桌面,
  2. 打开此文件(以 .cer 扩展名结尾);这将打开钥匙串应用程序,允许您批准证书。

评论

3赞 chrishiestand 1/12/2021
在钥匙串 App 中打开证书后,编辑信任设置并将 SSL 设定为“始终信任”
99赞 kenorb 9/18/2012 #3

Linux操作系统

如果您使用的是 Linux,您还可以关注以下官方 wiki 页面:

基本上:

  • 单击带有 X 的锁定图标,
  • 选择“证书信息”
  • 转到“详细信息”选项卡
  • 单击导出...(另存为文件)

现在,以下命令将添加证书(其中 YOUR_FILE 是导出的文件):

certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n YOUR_FILE -i YOUR_FILE

若要列出所有证书,请运行以下命令:

certutil -d sql:$HOME/.pki/nssdb -L

如果仍然不起作用,则可能受到此错误的影响: 问题 55050:Ubuntu SSL 错误 8179

P.S. 在使用上述命令之前,还请确保您有 。libnss3-tools

如果没有,请通过以下方式安装:

sudo apt-get install libnss3-tools # on Ubuntu
sudo yum install nss-tools # on Fedora, Red Hat, etc.

作为奖励,您可以使用以下方便的脚本:

$ cat add_cert.sh
certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n $1 -i $1
$ cat list_cert.sh
certutil -d sql:$HOME/.pki/nssdb -L # add '-h all' to see all built-in certs
$ cat download_cert.sh
echo QUIT | openssl s_client -connect $1:443 | sed -ne '/BEGIN CERT/,/END CERT/p'

用法:

add_cert.sh [FILE]
list_cert.sh
download_cert.sh [DOMAIN]

故障 排除

  • 使用参数运行 Chrome--auto-ssl-client-auth

    google-chrome --auto-ssl-client-auth

评论

0赞 Paul Tobias 2/20/2015
太好了,我喜欢你的剧本。不过,您不需要 QUIT(反正没有像 QUIT 这样的 HTTP 命令),也不需要 sed,nss 工具可以在 BEGIN 和 END CERT 之间过滤掉证书。所以可以简单地说:download_cert.shecho | openssl s_client -connect $1:443
0赞 Kendrick 3/24/2016
我已经尝试了其他选项,但目前只有这个选项适用于适用于 Linux 的 Chrome 4x,它拒绝使用内置工具导入任何商店。
0赞 Joseph 10/14/2021
使用 Ubuntu 20.04 上的 Chrome,我无法让它工作,但最终能够让它使用"P,,"CT,c,c
571赞 kellen 2/26/2013 #4

这对我有用:

  1. 使用 Chrome,通过 HTTPS 点击服务器上的页面,然后继续经过红色警告页面(假设您尚未这样做)。
  2. 开门。Chrome Settings > Show advanced settings > HTTPS/SSL > Manage Certificates
  3. 单击选项卡并向下滚动以在您为证书提供的“组织名称”下找到您的证书。Authorities
  4. 选择它,单击“编辑”(注意:在最新版本的 Chrome 中,该按钮现在是“高级”而不是“编辑”),选中所有框并单击确定。您可能需要重新启动 Chrome。

您现在应该在页面上获得漂亮的绿色锁。

编辑:我在新计算机上再次尝试此操作,但证书没有出现在“管理证书”窗口中,只需从红色的不受信任的证书页面继续操作即可。我必须执行以下操作:

  1. 在包含不受信任证书(以红色划掉)的页面上,单击“证书信息”>锁定。注意:在较新版本的 chrome 上,您必须打开 ,然后选择 。https://Developer Tools > SecurityView certificate
  2. 单击 .选择作为文件格式。Details tab > ExportPKCS #7, single certificate
  3. 然后按照我的原始说明进入“管理证书”页面。单击 并选择将证书导出到的文件,并确保选择作为文件类型Authorities tab > ImportPKCS #7, single certificate
  4. 如果出现提示,请选择“受信任的根证书颁发机构”
  5. 选中所有复选框,然后单击确定。 重新启动 Chrome。

评论

0赞 jws 4/16/2021
替代步骤 2:导航到 chrome://settings/certificates。此外,如果您在生成自签名证书时遇到麻烦,并且制作了多个证书,请尝试使用此页面查找并删除以前导入的证书,然后重新导入。
8赞 tolache 1/17/2022
chrome://settings/certificates 不再有效,并且 Chrome 设置中的“安全”>“管理证书”>“权限”选项卡。有没有人得到更新的说明?
1赞 feeela 1/25/2022
chrome://settings/certificates在 Windows 下的 Chrome 中不存在。证书部分仅打开 Windows 证书链工具 – Chrome 似乎没有自己的证书存储空间
0赞 lucrp 3/9/2022
原始答案的编辑步骤使用 Chrome 版本对我有用。为了另存为 PKCS #7,我使用了扩展名并按此处所述导入了单个证书。99.0.4844.51.p7b
37赞 Kieran Moore 6/26/2013 #5

对于测试环境

您可以在启动 chrome 时用作命令行参数(在 Ubuntu 上处理版本 28.0.1500.52)。--ignore-certificate-errors

这将导致它忽略错误并在没有警告的情况下进行连接。如果您已经运行了一个版本的 chrome,则需要在从命令行重新启动之前关闭它,否则它将打开一个新窗口,但忽略参数。

我将 Intellij 配置为在进行调试时以这种方式启动 chrome,因为测试服务器从未有过有效的证书。

不过,我不建议像这样正常浏览,因为证书检查是一项重要的安全功能,但这可能对某些人有所帮助。

评论

5赞 mikhail-t 7/15/2013
它在 Windows 8 中对我有用!我只是右键单击了 chrome 快捷方式 > 属性 > 更改了“目标”字段,如下所示(请注意,应在引号后添加“--ignore-certificate-errors”,并带有空格):“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” --ignore-certificate-errors
1赞 jww 1/14/2015
这并不能回答这个问题,而且很危险。问题是如何让 Chrome 信任自签名服务器证书;而不是如何忽略警告和错误。
1赞 lubosdz 1/2/2018
这是在带有 Windows 7(63 位)的 Chrome (63.0.3239.108) 上唯一适合我的解决方案 7.在安全性方面,我在桌面上创建了特殊的图标,只有在本地虚拟机上开发时才会启动该图标。导入自签名本地证书,调整 chrome://flags 和HSTS域没有帮助。Chrome 绝对应该保留那个旧的好按钮“添加安全例外”——这将为我节省 2 个小时的无用设置。
0赞 Jonathan Martins 4/7/2020
本教程就像一个魅力!youtube.com/watch?v=qoS4bLmstlk
93赞 kmgdev 9/4/2013 #6

2017 年 11 月更新:此答案可能不适用于大多数较新版本的 Chrome。

更新02/2016:可以在此处找到针对Mac用户的更好说明。

  1. 在要添加的站点上,右键单击地址栏中的红色锁图标:enter image description here

    1. 单击标有“连接”的选项卡,然后单击“证书信息”

    2. 单击“详细信息”选项卡,单击“复制到文件...”按钮。这将打开证书导出向导,单击“下一步”进入“导出文件格式”屏幕。

    3. 选择 DER 编码的二进制 X.509 (.CER),单击下一步

    4. 单击“浏览...”,然后将文件保存到计算机。给它起个描述性的名字。单击“下一步”,然后单击“完成”。

    5. 打开 Chrome 设置,滚动到底部,然后点击显示高级设置...

    6. “HTTPS/SSL”下,单击“管理证书...”

    7. 单击“受信任的根证书颁发机构”选项卡,然后单击“导入...”按钮。这将打开证书导入向导。单击“下一步”进入“要导入的文件”屏幕。

    8. 单击“浏览...”,然后选择之前保存的证书文件,然后单击“下一步”。

    9. 选择“将所有证书放入以下存储区”。所选存储应为“受信任的根证书颁发机构”。如果不是,请单击“浏览...”,然后选择它。单击“下一步”和“完成”

    10. 单击安全警告上的“是”。

    11. 重新启动 Chrome。

评论

2赞 kmgdev 7/16/2014
@AJeneral是的,Chrome 又变了。本文中的说明最近对我有用。
2赞 Josh Hibschman 9/24/2015
截至此评论发布之日,Mac Chrome 上最晚不存在此选项。
2赞 Pacerier 11/6/2015
@kgrote,Chrome 没有自己的证书存储。它所做的只是添加和删除 Windows 的。因此,更好的方法是简单地用于添加和删除证书。certmgr.msc
2赞 ioan 8/6/2016
确实对我有用,谢谢。不得不重新启动Chrome,最重要的是,我的证书必须在2017年之前过期。SHA-1 的东西。
2赞 Bruno Bronosky 9/12/2017
CHROME 又变了!现在是步骤“在地址栏中,单击带有 X 的小锁。这将弹出一个小信息屏幕。
6赞 Oliver Salzburg 9/26/2013 #7

单击 URL 旁边的小划掉的锁图标时,您会看到一个如下所示的框:

enter image description here

单击“证书信息”链接后,您将看到以下对话框:

enter image description here

它告诉您哪个证书存储是正确的,它是受信任的根证书颁发机构存储。

您可以使用其他答案中概述的方法之一将证书添加到该存储区,也可以使用:

certutil -addstore -user "ROOT" cert.pem
  • ROOT是前面提到的证书存储的内部名称。
  • cert.pem是自签名证书的名称。

评论

1赞 Pacerier 11/6/2015
certutil -addstore -user "ROOT" cert.pem是 Windows?
1赞 Oliver Salzburg 11/6/2015
@Pacerier:没错,它是针对 Windows 的。
0赞 tryingHard 11/13/2019
你有它,但仍然有问题:imgur.com/a/mjlglVz imgur.com/a/n8BFH5S Windows 10,chrome 78Trusted Root Certification Authorities
62赞 LunaCodeGirl 1/14/2014 #8

如果您在 Mac 上没有看到导出选项卡或如何获取证书,这对我有用:

  1. 单击 https:// 前的锁
  2. 转到“连接”选项卡
  3. 点击“证书信息”

    现在你应该看到这个:Different information of course and yours should be marked as trusted yet (otherwise      you probably wouldn't be here)

  4. 将那个小证书图标拖到桌面(或任何地方)。

  5. 双击下载的 .cer 文件,这应该会将其导入到您的钥匙串中,然后打开钥匙串访问以访问您的证书列表。

    在某些情况下,这已经足够了,您现在可以刷新页面。

    否则:

  6. 双击新添加的证书。
  7. 在信任下拉列表下,将“使用此证书时”选项更改为“始终信任”

现在重新加载有问题的页面,它应该有问题了!希望这会有所帮助。


Wolph 编辑

为了简化此操作,您可以使用以下脚本(源代码):

  1. 将以下脚本另存为:whitelist_ssl_certificate.ssh

    #!/usr/bin/env bash -e
    
    SERVERNAME=$(echo "$1" | sed -E -e 's/https?:\/\///' -e 's/\/.*//')
    echo "$SERVERNAME"
    
    if [[ "$SERVERNAME" =~ .*\..* ]]; then
        echo "Adding certificate for $SERVERNAME"
        echo -n | openssl s_client -connect $SERVERNAME:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee /tmp/$SERVERNAME.cert
        sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" /tmp/$SERVERNAME.cert
    else
        echo "Usage: $0 www.site.name"
        echo "http:// and such will be stripped automatically"
    fi
    
  2. 使脚本可执行(从 shell):

    chmod +x whitelist_ssl_certificate.ssh
    
  3. 运行所需域的脚本(只需复制/粘贴完整的 url 即可):

    ./whitelist_ssl_certificate.ssh https://your_website/whatever
    

评论

1赞 Kevinleary.net 6/24/2014
这种方法在 OS X Mavericks 上对我有用,没有可用的导出选项,如上面的顶部答案中所述。
0赞 nalply 8/25/2014
效果很好。https 之前的锁仍然被划掉了,但没关系,因为不再有烦人的弹出窗口了。
1238赞 Chris 8/9/2015 #9

仅适用于(Chrome 119 及更高版本)localhost

  1. 只需在 Chrome 中访问此链接:

    chrome://flags/#temporary-unexpire-flags-m118
    
  2. 您应该会看到突出显示的文本,内容如下:

    暂时取消自 M118 起过期的标志。这些标志将很快被删除。– Mac、Windows、Linux、ChromeOS、Android、Fuchsia、Lacros

  3. 点击然后重新调整 Chrome。Enable

仅适用于(Chrome 118 及更低版本)localhost

  1. 只需在 Chrome 中访问此链接:

    chrome://flags/#allow-insecure-localhost
    
  2. 您应该会看到突出显示的文本,内容如下:

    允许从 localhost 加载的资源使用无效证书

  3. 点击。Enable

其他站点的选项

评论

3赞 Hugo Wood 8/30/2016
禁用警告...还有缓存!bugs.chromium.org/p/chromium/issues/detail?id=103875
6赞 baywet 1/5/2018
如果您在隐身模式下使用 chrome(例如切换身份),这将不起作用,但否则非常干净
9赞 timbo 6/21/2018
这个 - 如果你能忍受烦人的红色不安全味精。否则,这将是数小时的神秘 openssl 咒语,然后试图处理 Chrome 中的内部证书管理器。
69赞 Mehdi 8/24/2018
我不知道为什么这个答案被投票了,但无效证书和自签名证书是有区别的。问题是关于自签名证书的。
6赞 Vic Seedoubleyew 6/11/2019
对我根本没有用。对我有用的是生成一个包含 subjectAltName 的自签名证书,如下所示:stackoverflow.com/a/42917227/2873507
7赞 Vincil Bishop 8/14/2015 #10

这对我有用。请参见:http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/#.Vcy8_ZNVhBc

在地址栏中,单击带有 X 的小锁。这将显示一个小信息屏幕。单击显示“证书信息”的按钮。

单击图像并将其拖动到桌面上。它看起来像一个小证书。

双击它。这将打开钥匙串访问实用程序。输入您的密码以将其解锁。

请确保将证书添加到系统钥匙串,而不是登录钥匙串。单击“始终信任”,即使这似乎没有任何作用。

添加后,双击它。您可能需要再次进行身份验证。

展开“信任”部分。

“使用此证书时”设置为“始终信任”

评论

0赞 alexw 9/11/2020
这似乎有效!您可能需要在最后重新启动浏览器。
9赞 James Oravec 4/7/2016 #11

我继续使用 bjnord 建议的过程,即:Google Chrome、Mac OS X 和自签名 SSL 证书

博客中显示的内容不起作用。

然而,博客的一条评论是黄金:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain site.crt

您需要关注有关如何获取证书文件的博客,之后您可以使用上面的命令,并且应该可以开始了。

24赞 DejerNet 4/13/2016 #12

正如有人指出的那样,您需要重新启动所有Chrome,而不仅仅是浏览器窗口。执行此操作的最快方法是打开一个选项卡以...

chrome://restart

评论

0赞 Jose Cifuentes 1/9/2019
嘿!只是想指出,这就是为我修复它的原因。我正在向信任存储添加自定义 CA,它一直以这种方式为我工作。我尝试了 Firefox 并完美运行,但不是 chrome。最后,这是因为您似乎需要完全重新启动 chrome,正如您提到的。只要这些后台进程仍在运行,Chrome 可能会继续使用相同的信任存储。
6赞 user2871617 7/1/2016 #13

修复了 Windows 上的 Chrome。

首先,您需要导出证书。

  • 在浏览器中找到 URL。URL 的“https”段将是 用红线划掉,左边会有一个锁定符号。
  • 右键单击划掉的“https”段。
  • 您将看到一个包含各种信息的信息窗口
  • 点击“详细信息”。
  • 导出证书,按照说明接受默认设置。

导入

  • 转到 Chrome 设置
  • 点击“高级设置”
  • 在HTTPS/SSL下,单击“管理证书”
  • 转到“受信任的根证书颁发机构”
  • 点击“导入”
  • 将有一个弹出窗口,询问您是否要安装此证书。点击“是”。

评论

0赞 Quip11 1/5/2019
它说它找不到私钥。
1赞 Rikke Bendlin Gammelmark 8/28/2019
您可能尝试过在“您的证书”选项卡下导入,您需要使用“授权”选项卡下的导入。
0赞 maximus 10/26/2019
我尝试在所有选项卡下导入,即使在重新启动 chrome 后,这些选项卡都不起作用
2赞 tryingHard 11/13/2019
它对我不起作用,imgur.com/a/xoqXaHD Win 10,这里的 chrome 78。
92赞 Raman 8/13/2016 #14

更新4月 23/2020

Chromium 团队推荐

https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins#TOC-Testing-Powerful-Features

快速、超级简单的解决方案

有一个秘密的绕过短语,可以在错误页面中输入,让 Chrome 在出现安全错误的情况下继续运行:thisisunsafe(在早期版本的 Chrome 中,键入 badidea,甚至更早,键入 danger)。除非您确切了解为什么需要它,否则不要使用它!

源:

https://chromium.googlesource.com/chromium/src/+/d8fc089b62cd4f8d907acff6fb3f5ff58f168697%5E%21/

(请注意,解析为window.atob('dGhpc2lzdW5zYWZl')thisisunsafe)

最新版本的源代码是 @ https://chromium.googlesource.com/chromium/src/+/refs/heads/master/components/security_interstitials/core/browser/resources/interstitial_large.js,该函数可以在 JS 控制台中执行。window.atob

有关 Chrome 团队更改绕过短语的原因(第一次)的背景信息:

https://bugs.chromium.org/p/chromium/issues/detail?id=581189

如果所有其他方法都失败(解决方案#1)

对于快速的一次性操作,如果“仍然继续”选项不可用,并且绕过短语不起作用,则此技巧效果很好:

  1. 通过启用此标志来允许证书错误(请注意,Chrome 在更改标志值后需要重新启动):localhost

    chrome://flags/#allow-insecure-localhost

    (并投票支持 https://stackoverflow.com/a/31900210/430128@Chris

  2. 如果要连接到的站点是 ,则已完成。否则,请设置一个 TCP 隧道以在本地侦听端口 8090 并连接到端口 443,确保您已在终端窗口中安装并运行如下内容:localhostbroken-remote-site.comsocat

    socat tcp-listen:8090,reuseaddr,fork tcp:broken-remote-site.com:443

  3. 在浏览器中转到 https://localhost:8090

如果所有其他方法都失败(解决方案#2)

与“如果所有其他方法都失败(解决方案 #1)”类似,这里我们使用 ngrok 配置本地服务的代理。由于可以通过 TLS(在这种情况下,它由具有有效证书的 ngrok 终止)或通过非 TLS 终结点访问 ngrok http 隧道,因此浏览器不会抱怨证书无效。

下载并安装 ngrok,然后通过以下方式公开它:ngrok.io

ngrok http https://localhost

ngrok 将启动并提供可连接到的主机名,所有请求都将通过隧道传输回本地计算机。

评论

0赞 formatkaka 8/24/2017
任何试图将 localhost 与 https 一起用于服务工作者的人,If-all-fails 的第一点在 chrome 60 ubuntu 14.04 上为我工作
0赞 Ray Foss 2/22/2019
这仍将证书视为无效,并使密码管理拒绝工作
192赞 Tobias J 3/21/2017 #15

Chrome 58+ 更新(发布于 2017 年 4 月 19 日)

从 Chrome 58 开始,删除了仅使用来识别主机的功能。现在必须使用证书来标识其主机。请参阅此处的进一步讨论此处的错误跟踪器。过去,仅用于多主机证书,因此某些内部 CA 工具不包括它们。commonNamesubjectAltNamesubjectAltName

如果您的自签名证书过去运行良好,但突然开始在 Chrome 58 中生成错误,这就是原因。

因此,无论您使用何种方法生成自签名证书(或由自签名 CA 签名的证书),请确保服务器的证书包含具有正确和/或条目/条目的证书,即使它仅适用于单个主机subjectAltNameDNSIP

对于 openssl,这意味着您的 OpenSSL 配置(在 Ubuntu 上)对于单个主机应具有类似于以下内容的内容:/etc/ssl/openssl.cnf

[v3_ca]   # and/or [v3_req], if you are generating a CSR
subjectAltName = DNS:example.com

或对于多个主机:

[v3_ca]   # and/or [v3_req], if you are generating a CSR
subjectAltName = DNS:example.com, DNS:host1.example.com, DNS:*.host2.example.com, IP:10.1.2.3

在 Chrome 的证书查看器(已移至 F12 下的“安全”选项卡)中,您应该会看到它列在以下位置:ExtensionsCertificate Subject Alternative Name

Chrome cert viewer

评论

0赞 eliassal 2/19/2021
嗨,我添加了主题备用名称,但是,导入到我的商店并且 CA 颁发机构在受信任的商店中,重新启动了 Chrome,但仍然说 SAN 丢失
0赞 Glen Mazza 5/23/2021
v3_req选项在 CSR 中获取 subjectAltName 对我有用。但是,当使用我的自签名 CA 生成证书时,它被忽略了。(使用 LibreSSL 2.6.5)如OpenSSL说明书中所示(请参阅“创建对多个主机名有效的证书”),后者我需要的是创建一个包含subjectAltName = DNS:localhost的myserver.ext文本文件。然后我运行了 openssl x509 -req ... -extfile myserver.ext 。我可以确认通过“openssl x509 -text -in myserver.crt -noout”添加的SAN
134赞 Brad Parks 4/28/2017 #16

在 Mac 上,您可以通过执行以下操作在系统级别创建 Chrome 和 Safari 完全信任的证书:

# create a root authority cert
./create_root_cert_and_key.sh

# create a wildcard cert for mysite.com
./create_certificate_for_domain.sh mysite.com

# or create a cert for www.mysite.com, no wildcards
./create_certificate_for_domain.sh www.mysite.com www.mysite.com

上面使用以下脚本和支持文件,以避免主题替代名称丢失错误v3.ext

如果要使用自己的根证书颁发机构创建完全受信任的新自签名证书,可以使用这些脚本执行此操作。

create_root_cert_and_key.sh

#!/usr/bin/env bash
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

create_certificate_for_domain.sh

#!/usr/bin/env bash

if [ -z "$1" ]
then
  echo "Please supply a subdomain to create a certificate for";
  echo "e.g. www.mysite.com"
  exit;
fi

if [ ! -f rootCA.pem ]; then
  echo 'Please run "create_root_cert_and_key.sh" first, and try again!'
  exit;
fi
if [ ! -f v3.ext ]; then
  echo 'Please download the "v3.ext" file and try again!'
  exit;
fi

# Create a new private key if one doesnt exist, or use the xeisting one if it does
if [ -f device.key ]; then
  KEY_OPT="-key"
else
  KEY_OPT="-keyout"
fi

DOMAIN=$1
COMMON_NAME=${2:-*.$1}
SUBJECT="/C=CA/ST=None/L=NB/O=None/CN=$COMMON_NAME"
NUM_OF_DAYS=825
openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT device.key -subj "$SUBJECT" -out device.csr
cat v3.ext | sed s/%%DOMAIN%%/"$COMMON_NAME"/g > /tmp/__v3.ext
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days $NUM_OF_DAYS -sha256 -extfile /tmp/__v3.ext 

# move output files to final filenames
mv device.csr "$DOMAIN.csr"
cp device.crt "$DOMAIN.crt"

# remove temp file
rm -f device.crt;

echo 
echo "###########################################################################"
echo Done! 
echo "###########################################################################"
echo "To use these files on your server, simply copy both $DOMAIN.csr and"
echo "device.key to your webserver, and use like so (if Apache, for example)"
echo 
echo "    SSLCertificateFile    /path_to_your_files/$DOMAIN.crt"
echo "    SSLCertificateKeyFile /path_to_your_files/device.key"

v3.ext 版本

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
    
[alt_names]
DNS.1 = %%DOMAIN%%

再过一步 - 如何在 Chrome/Safari 中使自签名证书完全受信任

要允许自签名证书在 Chrome 和 Safari 中完全受信任,您需要将新的证书颁发机构导入 Mac。为此,请遵循以下说明,或 mitmproxy 网站上有关此常规过程的更详细说明:

您可以在命令行中通过以下两种方式之一执行此操作,该命令将提示您输入密码:

$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain rootCA.pem

或使用应用程序:Keychain Access

  1. 打开钥匙串访问
  2. 在“钥匙串”列表中选择“系统”
  3. 在“类别”列表中选择“证书”
  4. 选择“文件 |导入项目...”
  5. 浏览到上面创建的文件“rootCA.pem”,选择它,然后单击“打开”
  6. 在“证书”列表中选择新导入的证书。
  7. 单击“i”按钮,或右键单击您的证书,然后选择“获取信息”
  8. 展开“信任”选项
  9. 将“使用此证书时”更改为“始终信任”
  10. 关闭对话框,系统将提示您输入密码。
  11. 关闭并重新打开使用目标域的任何选项卡,它将被安全加载!

作为奖励,如果您需要 Java 客户端信任证书,您可以通过将证书导入 Java 密钥库来实现。请注意,如果证书已存在,这将从密钥库中删除证书,因为它需要更新它以防万一。当然,它只对要导入的证书执行此操作。

import_certs_in_current_folder_into_java_keystore.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -delete -storepass changeit -alias alias__${crt} -keystore $KEYSTORE;
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

评论

0赞 donut 5/10/2017
运行时出现“打开私钥rootCA.key时出错”。macOS 10.12.4 和 OpenSSL 0.9.8zh 2016 年 1 月 14 日。$ ./create_root_cert_and_key.sh
1赞 donut 5/10/2017
运行之前修复了我遇到的“打开私钥rootCA.key时出错”错误。$ openssl genrsa -out rootCA.key 2048$ ./create_root_cert_and_key.sh
2赞 Lenny 5/10/2017
弄清楚了解决方案(以防其他人遇到这种情况)是更改为......-key-keyoutopenssl req -new -newkey rsa:2048 -sha256 -nodes -keyout device.key -subj "$SUBJECT" -out device.csr
5赞 Greg Blass 11/28/2017
对 localhost 执行此操作时,我仍然在计算机上的 Chrome 中收到错误:证书错误 站点的证书链 (net::ERR_CERT_COMMON_NAME_INVALID) 存在问题。
1赞 Brad Parks 7/28/2022
是的,“再进一步 - 如何使自签名证书在 Chrome/Safari 中完全受信任”步骤基本上意味着“如何使此证书在系统中的任何地方都受信任,除了 java” - 因此,如果您也希望它在 Java 中工作,请遵循该部分!
34赞 UUHHIVS 6/7/2017 #17

WINDOWS 2017 年 6 月 Windows Server 2012

我遵循了帕克斯@Brad回答。在 Windows 上,应将 rootCA.pem 导入到受信任的根证书颁发机构存储中。

我执行了以下步骤:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -newkey rsa:4096 -sha256 -days 1024 -out rootCA.pem
openssl req -new -newkey rsa:4096 -sha256 -nodes -keyout device.key -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 2000 -sha256 -extfile v3.ext

其中 v3.ext 位于:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 192.168.0.2
IP.2 = 127.0.0.1

然后,就我而言,我有一个自托管的 Web 应用程序,因此我需要将证书与 IP 地址和端口绑定,证书应该在我的商店中,其中包含私钥信息,因此我导出为 pfx 格式。

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

使用 mmc 控制台(文件/添加或删除管理单元/证书/添加/计算机帐户/LocalComputer/OK),我在个人存储中导入了 pfx 文件。

后来我用这个命令绑定了证书(你也可以使用HttpConfig工具):

netsh http add sslcert ipport=0.0.0.0:12345 certhash=b02de34cfe609bf14efd5c2b9be72a6cb6d6fe54 appid={BAD76723-BF4D-497F-A8FE-F0E28D3052F4}

certhash=证书 Thumprint

appid=GUID(您的选择)

首先,我尝试以不同的方式在受信任的根证书颁发机构上导入证书“device.crt”,但我仍然收到相同的错误:

enter image description here

但是我意识到我应该导入根证书颁发机构的证书,而不是域的证书。所以我使用了 mmc 控制台(文件/添加或删除管理单元/证书/添加/计算机帐户/LocalComputer/OK),我在受信任的根证书颁发机构存储中导入了 rootCA.pem。

enter image description here

重新启动 Chrome 等瞧,它可以工作。

使用 localhost:

enter image description here

或使用 IP 地址:

enter image description here

我唯一无法实现的是,它具有过时的密码(图片上的红色方块)。在这一点上,我们很感激帮助。

使用 makecert 时,无法添加 SAN 信息。 使用 New-SelfSignedCertificate (Powershell) 可以添加 SAN 信息,它也可以工作。

评论

3赞 Jose A 10/10/2017
重要提示:以管理员身份运行 OpenSSL。
0赞 ShadeBlack 1/14/2019
这是最好的答案,截至 2019 年 1 月,仍然适用于 Chrome[71.0.3578.98]
0赞 7/24/2019
哇,它奏效了,非常感谢(在 Chrome 75 上 - 2019 年 7 月)。除非使用 Windows Server,否则不需要该步骤。此外,我认为没有必要将证书文件导出到 pfx。netsh http
0赞 petrosmm 5/28/2020
已确认工作:Chrome 81 - 2020 年 5 月 - Windows 7
0赞 GeneCode 3/17/2021
但是如何运行受信任的证书商店应用程序?这个答案并不完整
6赞 Adriano Rosa 6/18/2017 #18

从 Chrome 58+ 开始,由于缺少 SAN,我开始在 macOS 上收到证书错误。这是再次获得地址栏上的绿色锁的方法。

  1. 使用以下命令生成新证书:

    openssl req \
      -newkey rsa:2048 \
      -x509 \
      -nodes \
      -keyout server.key \
      -new \
      -out server.crt \
      -subj /CN=*.domain.dev \
      -reqexts SAN \
      -extensions SAN \
      -config <(cat /System/Library/OpenSSL/openssl.cnf \
          <(printf '[SAN]\nsubjectAltName=DNS:*.domain.dev')) \
      -sha256 \
      -days 720
    
  2. 将 导入到钥匙串中,然后双击证书,展开“信任”,然后选择始终信任server.crt

在 Google Chrome 中刷新页面 https://domain.dev,使绿色锁恢复。

评论

0赞 François Romain 8/3/2017
这适用于子域,但我仍然有一个警告页面:任何想法?api.domain.devdomain.devThis server could not prove that it is domain.dev; its security certificate is from *.domain.dev. This may be caused by a misconfiguration or an attacker intercepting your connection.
6赞 Layne Faler 11/29/2017 #19

我自己解决了这个问题,没有更改任何具有适当SSL认证的浏览器上的设置。我使用的是 mac,因此需要对我的 ssl 认证进行钥匙串更新。我必须将主题替代名称添加到 ssl 认证中,以便 chrome 接受它。截至今天,这适用于 Chrome 版本号:62.0.3202.94

我的示例是易于使用的命令和配置文件:

添加这些文件,此示例全部位于一个根目录中

ssl.conf 文件

[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = req_ext

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
stateOrProvinceName         = State or Province Name (full name)
localityName                = Locality Name (eg, city)
organizationName            = Organization Name (eg, company)
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1   = localhost

运行命令以创建证书:

openssl req -newkey rsa:4096 -nodes -keyout key.pem -x509 -days 3650 -out certificate.pem -extensions req_ext -config ssl.conf -subj '/CN=localhost/O=Stackflow/C=US/L=Los Angeles/OU=StackflowTech'

对于仅要添加受信任认证的 mac(必需):

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ./certificate.pem

对于 Windows,您必须找到如何在本地独立验证我们的 ssl 证书。我不使用 Windows。对不起,窗户的家伙和女孩。

我正在使用带有 express.js 的 node.js 服务器,只需要我的密钥和认证,如下所示:

应用.js

const https = require('https');
const Express = require('express');
const fs = require('fs');
const app = new Express();
const server = https.createServer({
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./certificate.pem'),
}, app);
server.listen(3000);

我将来可能会为其他后端框架执行此操作,因此我将来可以为其他人更新示例。但这是我在 Node.js 中对该问题的修复。清除浏览器缓存并在 https:// 上运行应用

以下是在 Node.js 服务器上为 Mac 用户运行 https://localhost 的示例:

https://github.com/laynefaler/Stack-Overflow-running-HTTPS-localhost

祝您编码愉快!

274赞 Yevgeniy Afanasyev 12/5/2017 #20

单击页面上的任意位置并键入:BYPASS_SEQUENCE

BYPASS_SEQUENCE Chrome 版本
thisisunsafe 65 - ?
badidea 62 - 64
danger ?- 61

您无需查找输入字段;只需输入即可。感觉很奇怪,但它有效。我在Mac High Sierra上尝试过。

要仔细检查他们是否再次更改了它,请转到最新的 Chromium 源代码。目前看起来像这样:BYPASS_SEQUENCE

var BYPASS_SEQUENCE = window.atob('dGhpc2lzdW5zYWZl');

现在他们已经伪装了它,但要看到真实的,你可以在浏览器控制台中运行以下行。BYPASS_SEQUENCE

console.log(window.atob('dGhpc2lzdW5zYWZl'));

作为键入短语的替代方法,您可以将此代码片段粘贴到控制台中。

sendCommand(SecurityInterstitialCommandId.CMD_PROCEED)

评论

24赞 Martin Melka 10/26/2020
我非常怀疑这是否真的有效,感觉就像在游戏中输入作弊码一样。但是瞧,确实适用于 Chrome 86。thisisunsafe
4赞 KarlKode 7/17/2021
如果您看到“此证书无效”页面,只需输入字母,窗口应重新加载并显示页面内容。(我也在 Chrome 91 上,对我来说它仍然有效。
1赞 KarlKode 7/23/2021
问题是该按钮没有出现在 localhost 上。
5赞 Gedweb 8/26/2021
您可以将代码部分粘贴到控制台中,而不是键入短语sendCommand(SecurityInterstitialCommandId.CMD_PROCEED)
2赞 Paul 4/26/2022
这仍然适用于 Chrome 版本 100,即 2022 年 4 月。
7赞 Alex Ivasyuv 6/15/2018 #21
mkdir CA
openssl genrsa -aes256 -out CA/rootCA.key 4096
openssl req -x509 -new -nodes -key CA/rootCA.key -sha256 -days 1024 -out CA/rootCA.crt

openssl req -new -nodes -keyout example.com.key -out domain.csr -days 3650 -subj "/C=US/L=Some/O=Acme, Inc./CN=example.com"
openssl x509 -req -days 3650 -sha256 -in domain.csr -CA CA/rootCA.crt -CAkey CA/rootCA.key -CAcreateserial -out example.com.crt -extensions v3_ca -extfile <(
cat <<-EOF
[ v3_ca ]
subjectAltName = DNS:example.com
EOF
)

评论

1赞 Romain 9/29/2019
这是唯一一个适用于我的 chrome 77。谢谢你救了我的一天。
1赞 Chiwda 11/3/2019
如何使用生成的文件?我了解如何使用域 .crt 和 .key 文件,但 .csr 文件有什么用?如何使用 rootCA.* 文件?请扩展您的答案...
8赞 TetraDev 11/28/2018 #22

用于在 Linux 上的 Chromium 上管理 SSL 证书的 GUI 对我来说无法正常工作。然而,他们的文档给出了正确的答案。诀窍是运行下面的命令,导入自签名SSL证书。只需更新 和 的名称,然后重新启动 chromium/chrome。<certificate-nickname>certificate-filename.cer

从文档中:

在 Linux 上,Chromium 使用 NSS 共享数据库。如果内置管理器不适合您,则可以使用 NSS 命令行工具配置证书。

获取工具

  • Debian/Ubuntu:sudo apt-get install libnss3-tools

  • 软呢帽:su -c "yum install nss-tools"

  • Gentoo:(你需要启动以下所有带有前缀的命令,例如。 Opensuse:su -c "echo 'dev-libs/nss utils' >> /etc/portage/package.use && emerge dev-libs/nss"nssnsscertutilsudo zypper install mozilla-nss-tools

要信任自签名服务器证书,我们应该使用

certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n <certificate-nickname> -i certificate-filename.cer

列出所有证书

certutil -d sql:$HOME/.pki/nssdb -L

TRUSTARGS 是三个字符串,由零个或多个字母字符组成,用逗号分隔。它们定义了 SSL、电子邮件和对象签名应如何信任证书,并在 certutil 文档或 Meena 关于信任标志的博客文章中进行了说明。

添加用于 SSL 客户端身份验证的个人证书和私钥 使用以下命令:

pk12util -d sql:$HOME/.pki/nssdb -i PKCS12_file.p12

导入存储在 PKCS #12 文件中的个人证书和私钥。个人证书的 TRUSTARGS 将设置为“u,u,u”。

删除证书 certutil -d sql:$HOME/.pki/nssdb -D -n <certificate nickname>

摘自:https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_cert_management.md

9赞 Ray Foss 2/22/2019 #23

对于 Fedora、Ubuntu、Linux,如果您在使用 GUI 添加证书以添加新的根证书颁发机构时遇到错误。如果要信任服务器自签名证书,则不能提及无效的颁发机构...即使那是它本身。我只能通过信任我的权限并使用该权限密钥来签署服务器证书来使其工作。example.com Not a Certification authority

下面是它接受的自签名 CA 证书。这是我发现工作的唯一方法,我花了几个小时试图让它接受自签名的终点证书,没有雪茄。UI 将接受自签名颁发机构,只要它已声明。之后,Chrome 将接受由该密钥使用正确 DN 签名的所有证书,而无需单独添加它们。cert_authority_invalidCA:TRUE

openssl req -new -x509 -extensions v3_req -days 8440 -config ca.conf -key rockstor.key -out rockstor.cert

[req]
distinguished_name=dn
req_extensions=v3_req
prompt = no

[v3_req]
basicConstraints=CA:TRUE,pathlen:0
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@alt_names

[alt_names]
DNS.1 = ca.tdpowerskills.com

[dn]
C = US
ST = LA
L = Alexandria
O = TDPS Certification Authority
OU = LEARNOPS
CN = ca.tdpowerskills.com

openssl req -new -x509 -extensions v3_req -days 8440 -config config.conf -key rockstor.key -out rockstor.cert

[req]
distinguished_name=dn
req_extensions=v3_req
prompt = no

[v3_req]
basicConstraints=CA:FALSE
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@alt_names
issuerAltName=DNS:ca.tdpowerskills.com

[alt_names]
DNS.1 = big.tdps.app

[dn]
C = US
ST = LA
L = Alexandria
O = TDPS Certification Authority
OU = LEARNOPS
CN = ca.tdpowerskills.com

如果这不起作用:

  • chrome://restart实际重新启动

  • 尝试使用Firefox获取有关错误的更多详细信息,它往往会更好地解释错误。虽然 Chrome 会说:,但 Firefox 会抛出:。ERR_CERTIFICATE_INVALIDMOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY

  • 请记住,Chrome 现在需要主题备用名称,并且几乎忽略了 CN。

对于其他人:

  • certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n <nickname> -i <my.crt>对于服务器证书

  • certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n <nickname> -i <my.crt> 对于 CA

  • 对于 Firefox,添加异常证书的 UI 确实有效,一旦您这样做,它就会信任它。

  • 也许你有时髦的设置,其中与你的配置合并。/etc/pki/tls/openssl.cnf

  • 也许您没有向配置或命令行添加扩展,例如v3_req

  • 请注意,我的方法绕过了对 CSR 的需求,只需使用颁发机构密钥对证书进行签名并添加开发服务器的详细信息。CSR 允许更多密钥以实现实际安全。

  • 我尝试了所有方法,但 Chrome 需要设置的权限。服务器证书必须全部由有效的颁发机构颁发,即使这只是自己签名的另一个证书。basicconstraints CA:trueCA:true

8赞 Soya Bean 3/19/2019 #24

通过此方法允许不安全的 localhost 正常工作 chrome://flags/#allow-insecure-localhost

只是您需要将开发主机名创建为 xxx.localhost。

8赞 mpowrie 5/21/2019 #25

若要在 Windows 中创建 Chrome v58 及更高版本信任的自签名证书,请使用提升的权限启动 Powershell,然后键入:

New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -Subject "fruity.local" -DnsName "fruity.local", "*.fruity.local" -FriendlyName "FruityCert" -NotAfter (Get-Date).AddYears(10)
#notes: 
#    -subject "*.fruity.local" = Sets the string subject name to the wildcard *.fruity.local
#    -DnsName "fruity.local", "*.fruity.local"
#         ^ Sets the subject alternative name to fruity.local, *.fruity.local. (Required by Chrome v58 and later)
#    -NotAfter (Get-Date).AddYears(10) = make the certificate last 10 years. Note: only works from Windows Server 2016 / Windows 10 onwards!!

执行此操作后,证书将保存到“个人\证书”存储下的“本地计算机”证书中。

您希望将此证书复制到受信任的根证书颁发机构\证书存储中。

一种方法是:单击 Windows 开始按钮,然后键入 。 然后,根据下面的屏幕截图,将新创建的证书拖放到受信任的根证书颁发机构\证书存储中。certlm.mscenter image description here

评论

0赞 Ifedi Okonkwo 9/25/2019
@mpowrie。生成此内容后,如何将其链接到 Apache Web 服务器?在 localhost 服务器上。
0赞 mpowrie 9/26/2019
Ifedi Okonkwo:对不起,我不确定 Apache Web 服务器,但使用 IIS,您可以添加 https 类型的站点绑定,包括完全限定的主机名,然后选择 SSL 证书。
0赞 StephenPAdams 1/6/2020
这就像一个魅力。我会说,如果要将该证书分配为绑定,则需要执行一个额外的步骤...并且证书也需要在个人>证书中。由于某种原因,拖放实际上将其从个人证书中删除,并将其放置在受信任的证书中。因此,请确保复制并粘贴它。
36赞 Michael 8/15/2019 #26

Filippo Valsorda 编写了一个跨平台工具 mkcert,为许多信任商店做到这一点。我猜想他写这篇文章的原因与这个问题有很多答案的原因相同:为受信任的根 CA 签名的证书做“正确”的事情是一件痛苦的事情。SubjectAltName

mkcert包含在 Windows、macOS 和多种 Linux 版本的主要包管理系统中。在测试强大功能的第 4 步的 Chromium 文档中也提到了它。

mkcert的

mkcert是用于制作本地受信任的开发证书的简单工具。它不需要任何配置。

$ mkcert -install
Created a new local CA at "/Users/filippo/Library/Application Support/mkcert" 💥
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊
$ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
Using the local CA at "/Users/filippo/Library/Application Support/mkcert" ✨

Created a new certificate valid for the following names 📜
 - "example.com"
 - "*.example.com"
 - "example.test"
 - "localhost"
 - "127.0.0.1"
 - "::1"

The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅

评论

0赞 Ryan 6/24/2021
我无法让它工作,至少对于我的 sslip.io 服务的子域是这样。
0赞 Josh Hibschman 4/20/2022
截至今天,在一台全新的 mac 上,我让它工作——但奇怪的是,Chrome 100.0.48 对“不安全”消息非常挑剔,直到我撤消标志并进入钥匙串并检查证书上的“信任所有人”。我猜它现在“安全”了吗?另一种解决方法是将证书图标从桌面上的 chrome 中拖出,然后将它们重新导入到钥匙串中,重新信任它们。allow-insecure-localhost
17赞 Ariel 12/12/2019 #27
  1. 在受信任的根 CA 存储中添加 CA 证书。

  2. 转到 chrome 并启用此标志!

chrome://flags/#allow-insecure-localhost

最后,只需使用 *.me 域或任何有效的域(如 *.com 和 *.net)并在主机文件中维护它们。对于我的本地开发人员,我使用 *.me 或 *.com 和主机文件,维护如下:

  1. 添加到主机。 C:/windows/system32/drivers/etc/hosts

    127.0.0.1 nextwebapp.me

注意:如果执行此操作时浏览器已打开,则错误将继续显示。因此,请关闭浏览器并重新开始。更好的是,隐身或开始新的会话以立即生效。

评论

0赞 Michael 12/17/2019
这似乎与得票最高的答案相同。
0赞 Ariel 12/17/2019
我只将本地开发中允许的域名(即 *.me 站点)添加到 Windows 中的主机文件中。人们添加证书,但有时即使证书安装正确,主机也无法验证 SSL 验证。在这种情况下,我们创建一个新会话。我只添加了这些提示。我已经把这个兔子洞挖得太深了,所以我想确保有人知道如果需要该怎么做。
458赞 JellicleCat 3/4/2020 #28

只需 5openssl 命令,您就可以完成此操作。

(请不要更改您的浏览器安全设置。)

使用以下代码,您可以 (1) 成为您自己的 CA,(2) 然后将您的 SSL 证书签名为 CA。 (3) 然后将 CA 证书(而不是进入您服务器的 SSL 证书)导入 Chrome/Chromium。(是的,这即使在 Linux 上也有效。

您只需将下面的代码复制到一个新文件(例如generate_certs.sh),更新变量 NAME 以及 DNS.2IP.1 并保存文件。使其可执行()并运行它,仅此而已。最后,您将为您生成 myCA.pem$NAME.crt$NAME.keychmod +x generate_certs.sh

注意:对于 Windows,一些报告说 openssl 必须使用 winpty 运行以避免崩溃。

######################
# Become a Certificate Authority
######################

# Generate private key
openssl genrsa -des3 -out myCA.key 2048
# Generate root certificate
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem

######################
# Create CA-signed certs
######################

NAME=mydomain.example # Use your own domain name
# Generate a private key
openssl genrsa -out $NAME.key 2048
# Create a certificate-signing request
openssl req -new -key $NAME.key -out $NAME.csr
# Create a config file for the extensions
>$NAME.ext cat <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = $NAME # Be sure to include the domain name here because Common Name is not so commonly honoured by itself
DNS.2 = bar.$NAME # Optionally, add additional domains (I've added a subdomain here)
IP.1 = 192.168.0.13 # Optionally, add an IP address (if the connection which you have planned requires it)
EOF
# Create the signed certificate
openssl x509 -req -in $NAME.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial \
-out $NAME.crt -days 825 -sha256 -extfile $NAME.ext

回顾

  1. 成为 CA。
  2. 使用 CA 证书 + 密钥对证书进行签名。
  3. 在 Chrome 设置(“设置”>“管理证书”>“颁发机构”>导入)中将 myCA.pem 作为“颁发机构”导入(而不是“您的证书”)。
  4. 使用服务器中的 $NAME.crt$NAME.key 文件。

您可以检查您的工作,以确保证书已正确生成:

openssl verify -CAfile myCA.pem -verify_hostname bar.mydomain.example mydomain.example.crt

适用于 Mac 的额外步骤

  1. 在“文件>导入文件”中导入 CA 证书,然后在列表中找到它,右键单击它,展开“>信任”,然后选择“始终”
  2. 在下面添加,并确保将“CommonName”设置为与要求设置时相同。extendedKeyUsage=serverAuth,clientAuthbasicConstraints=CA:FALSE$NAME

适用于 Windows 的额外步骤

  1. 通过执行以下操作将 myCA.pem 转换为 myCA.pfx

    openssl pkcs12 -export -out myCA.pfx -inkey myCA.key -in myCA.pem
    
  2. 通过打开(双击)myCA.pfx 文件,选择“本地计算机”和“下一步”,再次输入密码,然后选择“下一步”,然后选择“将所有证书放入以下存储:”,然后单击“浏览”,选择“受信任的根证书颁发机构”,然后选择“下一步”,然后单击“完成”,将 myCA.pfx 导入到 Windows 的受信任证书颁发机构中。

现在,您的 CA 证书受 Windows 信任。当您导入并使用证书时,Windows 和 Chrome 将自动信任该证书。$NAME

评论

7赞 JellicleCat 3/18/2020
@maverick浏览器和操作系统附带了有限数量的它们信任的 CA。尽管任何人都可以成为 CA,但要让任何人信任他们的证书,他们需要人们手动将其添加为受信任的 CA(就像我们在手动导入证书时告诉 Chrome 的那样)。
9赞 michielbdejong 3/24/2020
伟大!对于像我这样的Mac用户来说,有两点说明:在最后一行,使用而不是由于 superuser.com/questions/1492643/...,值得注意的是,要将根证书导入Key Chain Access,您不仅需要“文件>导入文件”,还需要在列表中找到它,右键单击它,展开“>信任”,然后选择“始终”。-days 825-days 1825
9赞 Kerem Baydoğan 3/24/2020
如果您需要本地开发服务器的 PEM 文件而不是 CRT 文件,请不要担心,只需将 .crt 和 .csr 文件合并并将它们保存为 .pem 文件,您就可以开始了。
8赞 Fractal Mind 3/28/2020
终于成功了!BRAVO 的答案。请不要忘记将 myCA.pem 加载到您的 Chrome 或 Firefox(“设置”>“管理证书>颁发机构>导入)
11赞 8ctopus 6/19/2020
在 Windows 上的 Chrome/ium 中,当您尝试导入证书时,可用的文件扩展名中未列出 pem,但它仍然可以导入它(只需选择所有文件过滤器)。
7赞 user2217751 3/31/2020 #29

自 2020 年 3 月起,在使用 Chrome 81 的 MacOS Catalina 上,如上所述,使用 openssl 创建有效证书后,情况已更改。

首先,我使用 Safari 浏览了我的网站,然后单击警告页面底部的链接,该链接允许我无论如何访问该网站。这会将证书添加到我的 Mac 钥匙串(即 Keychain.app)。然后Safari会让我查看该页面。Chrome 显示该证书是受信任的,但不允许我查看该页面。我继续收到CERTIFICATE_INVALID错误。

在“钥匙串”中,选择左下角窗格中的“所有项目”。然后搜索您的本地主机 DNS 名称(即 myhost.example.com)。

双击您的证书。它将打开证书的编辑对话框。

将“使用此证书时”更改为“始终信任”

这完全是违反直觉的,因为SSL已经设置为Always Trust,大概是在添加证书时由Safari设置的。Chrome 只有在我将其全局更改为 Always Trust 后才开始工作。当我把它改回来时,它停止工作了。

7赞 orszaczky 6/6/2021 #30

2021 年 6 月 - Windows 10 - Chrome v91(简单)

按照 selfsignedcertificate.com 中的证书生成说明进行操作:

示例域名:,将其替换为您的域名。mydomain.local

  1. 要生成密钥,请执行以下操作:

    openssl genrsa -out mydomain.local.key 2048
    
  2. 创建仅包含以下内容的配置文件:mydomain.local.conf

    [req]
    distinguished_name=req
    [SAN]
    subjectAltName=DNS:mydomain.local
    

    注意:在 subcjectAltName 中,您可以定义更多域(可选),例如:

    subjectAltName=DNS:mydomain.local, DNS:*.mydomain.local, DNS:otherdomain.local, IP:192.168.1.10

  3. 创建证书:

    openssl req -new -x509 -key mydomain.local.key -out mydomain.local.crt -days 3650 -subj /CN=mydomain.local -extensions SAN -config mydomain.local.conf
    
  4. 将证书添加到受信任的根证书颁发机构

    • 右键单击 mydomain.local.crt 文件
    • 从上下文菜单中选择。Install Certificate
    • 在弹出窗口中选择。Local Machine
    • 选择。Place all certificates in the following store
    • 点击。Browse
    • 选择。Trusted Root Certification Authorities
    • 点击。OkNextFinish
    • 重新启动 Chrome。

评论

1赞 Ryan 6/24/2021
这看起来很有希望(serverfault.com/a/1017093/119666 很有帮助),但它对我不起作用。在 Brave(基本上是 Chrome)中,我仍然得到:NET::ERR_CERT_AUTHORITY_INVALID Subject: sslip.io Issuer: sslip.io
0赞 Eric 4/22/2023
在 Windows 10 + Apache + Chrome 112(2023 年 4 月)上完美运行,非常感谢您分享这个,我失去了希望