让Chrome接受自签名的localhost证书

问题描述 投票:969回答:40

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

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

google-chrome ssl certificate self-signed
40个回答
568
投票

仅适用于localhost

只需将其粘贴到您的chrome中:

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

您应该看到突出显示的文本说:允许从localhost加载的资源的无效证书

点击Enable


39
投票

更新于4月3/2018

由Chromium团队推荐

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

快速超级简易解决方案

有一个秘密旁路短语,可以输入错误页面,让Chrome继续运行,尽管存在安全错误:thisisunsafe(在早期版本的Chrome中,键入badidea,甚至更早,危险)。不要使用此,除非您完全理解为什么需要它!

资源:

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.jswindow.atob函数可以在JS控制台中执行。

有关Chrome团队为何更改旁路短语(第一次)的背景知识:

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

如果一切都失败了

如果没有“Proceed Anyway”选项,旁路短语不起作用,那么快速一次性,这个hack很好用:

  1. 通过启用此标记允许来自localhost的证书错误(注意Chrome在更改标志值后需要重新启动): chrome://flags/#allow-insecure-localhost (和@Chris投票回答https://stackoverflow.com/a/31900210/430128
  2. 如果您要连接的网站是localhost,那么您已经完成了。否则,设置TCP隧道以在本地侦听端口8090并连接到端口443上的broken-remote-site.com,确保安装了socat并在终端窗口中运行如下操作: socat tcp-listen:8090,reuseaddr,fork tcp:broken-remote-site.com:443
  3. 在浏览器中访问https://localhost:8090

34
投票

对于测试环境

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

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

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

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


18
投票

有人注意到,您需要重新启动所有Chrome,而不仅仅是浏览器窗口。最快的方法是打开一个选项卡...

chrome://restart


17
投票

WINDOWS JUN / 2017 Windows Server 2012

我跟着@Brad Parks的回答。在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控制台(文件/添加或删除管理单元/证书/添加/计算机帐户/本地计算机/确定)我在个人存储中导入pfx文件。

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

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

certhash =证书指纹

appid = GUID(您的选择)

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

enter image description here

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

enter image description here

重启Chrome和etvoilà它有效。

使用localhost:

enter image description here

或者使用IP地址:

enter image description here

我唯一无法实现的是,它有过时的密码(图片上的红色方块)。在这一点上,对此表示赞赏。

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


12
投票

您确定该网站的地址与证书相同吗?我在使用Chrome和自签名证书方面遇到了同样的问题,但最后我发现它对证书上域名的验证非常挑剔(应该是这样)。

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

Installing Certificates in Google Chrome

Installing Certificates in Internet Explorer

另外,请看一下创建自签名证书的几种不同方法(我假设您正在使用IIS,因为您没有提到过)。

How to Create a Self Signed Certificate in IIS 7


6
投票

单击URL旁边的小划线锁图标时,您将看到如下所示的框:

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

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

您可以使用其他答案中列出的方法之一将证书添加到该商店或使用:

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

6
投票

我使用了bjnord建议的过程:Google Chrome, Mac OS X and Self-Signed SSL Certificates

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

但是,该博客的评论之一是黄金:

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

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


5
投票

这篇文章已经充满了回复,但我根据其他一些答案创建了一个bash脚本,以便更容易生成在Chrome中有效的自签名TLS证书(在Chrome 65.x中测试)。希望它对其他人有用。

self-signed-tls bash script

安装(并信任)证书后,不要忘记重新启动Chrome(chrome://restart


值得一试的另一个工具是CloudFlare的cfssl工具包:

cfssl


5
投票

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

来自Docs:

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

获取工具

  • Debian / Ubuntu:sudo apt-get install libnss3-tools
  • Fedora:su -c "yum install nss-tools"
  • Gentoo:su -c "echo 'dev-libs/nss utils' >> /etc/portage/package.use && emerge dev-libs/nss"(您需要使用nss前缀启动下面的所有命令,例如nsscertutil。)Opensuse:sudo 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将设置为“你,你,你”。

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

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


4
投票

从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导入KeyChain,然后双击证书,展开Trust,并选择Always Trust

刷新Google Chrome中的页面https://domain.dev,以便绿色锁定恢复。


470
投票

这对我有用:

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

你现在应该在你的页面上得到漂亮的绿色锁。

编辑:我在一台新机器上再次尝试了这一点,只是从红色不受信任的证书页面继续,证书没有出现在“管理证书”窗口中。我必须做以下事情:

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

4
投票

我尝试了一切以及它的工作原理:导入时,选择正确的类别,即受信任的根证书颁发机构:

(对不起,这是德语,但只需按照图片)

enter image description here


3
投票

我不得不在macosx上调整Chrome启动器并添加到脚本下面。保存如下;

/ Applications / Google \ Chrome.app/Contents/MacOS/Chrome.command

#!/bin/sh
RealBin="Google Chrome"
AppDir="$(dirname "$0")"
exec "$AppDir/$RealBin" --ignore-certificate-errors "$@"

当我使用此脚本启动Chrome时,自签名证书可以正常运行。但是不要使用使用此脚本启动的浏览器浏览网页,您将不会收到有关无效证书的警告!


3
投票

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

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

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

双击它。这将打开Keychain Access实用程序。输入您的密码以解锁它。

确保将证书添加到系统密钥链,而不是登录密钥链。点击“始终信任”,即使这似乎没有做任何事情。

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

展开“信任”部分。

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


3
投票

这是不断出现的 - 特别是对于Mac OS X Yosemite上的谷歌浏览器!

值得庆幸的是,我们的一个开发团队今天向我发送了此链接,该方法可靠地工作,同时仍然允许您控制您接受证书的站点。

https://www.reddit.com/r/sysadmin/comments/3ercx4/chrome_shortcut_past_the_your_connection_is_not/cthporl

jersully帖子:

如果你不想打扰内部证书......

  1. 在地址栏中输入chrome://flags/
  2. 滚动或搜索“记住”决策,以便在指定的时间内完成SSL错误。
  3. 选择记住三个月。

3
投票

2017-06-27最新方法:

openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout yoursite.key \
    -new \
    -out yoursite.crt \
    -subj /CN=yoursite.dev \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:yoursite.dev')) \
    -sha256 \
    -days 3650

然后,将yoursite.crt和yoursite.key添加到你的nginx conf中。

来自:https://github.com/webpack/webpack-dev-server/issues/854


3
投票

我自己解决了这个问题,而没有在任何具有适当SSL认证的浏览器上更改设置。我使用mac,因此需要对我的ssl认证进行钥匙串更新。我必须将主题alt名称添加到chrome的ssl认证中以接受它。截至今天,这是针对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'

对于macs,仅添加可信认证(必需):

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

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

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

app.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://上运行您的应用

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

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

快乐的编码!


3
投票

当我尝试在浏览器中导入证书时,它对我不起作用...在chrome open Developer Tools> Security中,选择查看证书。单击详细信息选项卡并将其导出。

// LINUX

sudo apt-get install libnss3-tools 

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

运行此命令,如果你看到你刚刚导入的文件你很高兴!

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

// Windows

Start => run => certmgr.msc

在左侧选择受信任的根证书颁发机构=>个人。单击操作选项卡=>所有操作/导入,然后从浏览器中选择之前导出的文件

别忘了重启chrome !!!

祝好运! ;)


3
投票

对于MacOS上的Chrome,如果您准备了证书:

  • 退出Chrome(cmd + Q)。
  • 启动Keychain Access应用程序并打开“证书”类别。
  • 将证书文件拖到Keychain Access窗口,然后键入证书文件的密码。
  • 双击您的证书并展开“信任”列表。 在“使用此证书时”行中,选择“始终信任”。 关闭这些东西并输入密码。
  • 启动Chrome并清除所有缓存。
  • 检查一切都好。

2
投票

mac / osx上的SSL / HTTPS localhost修复:

  1. 尝试打开https localhost环境时,单击地址栏中带十字的红色锁。将打开一个窗口,其中包含有关证书的一些信息。
  2. 点击“详细信息”information window
  3. chrome Developer工具在“安全”选项卡上打开。单击“查看证书”。 The certificate image
  4. 将其添加到“系统”钥匙串(而不是默认选中的“登录”钥匙串)。
  5. 再次打开钥匙串并找到证书。点击它,确保你“信任”所有。
  6. 重新启动chrome,它应该工作。

2
投票

修复Windows上的Chrome。

首先,您需要导出证书。

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

要导入

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

135
投票

在Mac上,您可以使用Keychain Access实用程序将自签名证书添加到系统钥匙串,然后Chrome将接受它。我在这里找到了分步说明:

Google Chrome, Mac OS X and Self-Signed SSL Certificates

基本上:

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

2
投票

为了在Windows上进行开发,您可以 添加到Chrome快捷方式标志--ignore-certificate-errors

它希望忽略证书错误并允许您访问无效的证书网站。 https://support.opendns.com/entries/66657664中更详细的说明。

enter image description here


133
投票

更新58+更新(续期2017-04-19)

从Chrome 58开始,仅使用commonName is being removed识别主机。查看更多discussion herebug tracker here。过去,subjectAltName仅用于多主机证书,因此某些内部CA工具可能不包含它们。

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

因此,无论您使用哪种方法生成自签名证书(或由自签名CA签署的证书),请确保服务器的证书包含带有正确的subjectAltName和/或DNS条目/条目的IP,即使它仅用于一个主持人。

对于openssl,这意味着your OpenSSL config(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的cert查看器(已移至F12下的“安全”选项卡)中,您应该会在Extensions下将其列为Certificate Subject Alternative Name

Chrome cert viewer


93
投票

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

thisisunsafe”是Chrome版本65的BYPASS_SEQUENCE

badidea”Chrome版62 - 64。

danger”曾用于早期版本的Chrome

您不需要查找输入字段,只需键入它即可。这感觉很奇怪,但它确实有效。

我在Mac High Sierra上试过了。

要仔细检查是否再次更改它,请转到最新的铬Source Code

要查找BYPASS_SEQUENCE,目前它看起来像:

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

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

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

90
投票

更新11月11日:这个答案可能不适用于大多数较新版本的Chrome。

更新02/2016:可以找到更好的Mac用户说明Here

  1. 在要添加的站点上,右键单击地址栏中的红色锁图标: 单击标签为Connection的选项卡,然后单击Certificate Information 单击“详细信息”选项卡,单击“复制到文件...”按钮。这将打开“证书导出向导”,单击“下一步”进入“导出文件格式”屏幕。 选择DER编码二进制X.509(.CER),单击“下一步” 单击“浏览...”并将文件保存到计算机。将其命名为描述性的。单击Next,然后单击Finish。 打开Chrome设置,滚动到底部,然后点击显示高级设置... 在HTTPS / SSL下,单击管理证书... 单击“受信任的根证书颁发机构”选项卡,然后单击“导入...”按钮。这将打开“证书导入向导”。单击“下一步”转到“要导入的文件”屏幕。 单击“浏览...”并选择之前保存的证书文件,然后单击“下一步”。 选择将所有证书放在以下存储中。所选商店应为受信任的根证书颁发机构。如果不是,请单击“浏览...”并选择它。单击下一步并完成 在安全警告上单击是。 重启Chrome。

88
投票

Linux

如果您使用的是Linux,也可以按照以下官方维基页面进行操作:

基本上:

  • 单击带有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

如果它仍然不起作用,你可能会受到这个bug的影响:Issue 55050: Ubuntu SSL error 8179

附:在使用上述命令之前,请确保您有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]

Troubleshooting

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

75
投票

在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

The above uses the following scripts, and a supporting file v3.ext, to avoid subject alternative name missing errors

如果要使用自己的root权限创建一个完全受信任的新自签名证书,则可以使用这些脚本执行此操作。

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=999
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%%

One more step - How to make the self signed certs fully trusted in Chrome/Safari

要允许在Chrome和Safari中完全信任自签名证书,您需要将新的证书颁发机构导入Mac。为此,请遵循这些说明,或有关此一般过程on the mitmproxy website的更详细说明:

您可以在命令行中执行以下两种方法之一,使用此命令将提示您输入密码:

$ 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

56
投票

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

  1. 点击https://之前的锁定
  2. 转到“连接”选项卡
  3. 点击“证书信息” 现在你应该看到这个:
  4. 拖动那个小证书图标做你的桌面(或任何地方)。
  5. 双击下载的.cer文件,这应该将其导入您的钥匙串并打开Keychain Access到您的证书列表。 在某些情况下,这已足够,您现在可以刷新页面。 除此以外:
  6. 双击新添加的证书。
  7. 在信任下拉列表下,将“使用此证书时”选项更改为“始终信任”

现在重新加载有问题的页面,它应该是问题解决了!希望这可以帮助。


Edit from Wolph

为了使这更容易一些,您可以使用以下脚本(source):

  1. 将以下script保存为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
© www.soinside.com 2019 - 2024. All rights reserved.