我已经为 localhost CN 创建了自签名SSL证书。Firefox会像预期的那样在初始时抱怨后接受此证书。然而,Chrome和IE拒绝接受它,即使将证书添加到受信任的根证书存储中。尽管在点击Chrome的HTTPS弹出窗口中的“查看证书信息”时显示证书已正确安装,但它仍坚持认为无法信任该证书。
我应该怎么做才能让Chrome接受该证书并停止抱怨呢?
我已经为 localhost CN 创建了自签名SSL证书。Firefox会像预期的那样在初始时抱怨后接受此证书。然而,Chrome和IE拒绝接受它,即使将证书添加到受信任的根证书存储中。尽管在点击Chrome的HTTPS弹出窗口中的“查看证书信息”时显示证书已正确安装,但它仍坚持认为无法信任该证书。
我应该怎么做才能让Chrome接受该证书并停止抱怨呢?
localhost
在Chrome浏览器中访问此链接:
chrome://flags/#allow-insecure-localhost
您应该看到突出显示的文本,其中写着:
允许从localhost加载的资源使用无效证书
点击 启用。
尝试在窗口中的任何位置键入 thisisunsafe
,并且浏览器应该允许您访问该页面。
Chrome设置 > 显示高级设置 > HTTPS/SSL > 管理证书
。机构颁发的证书
选项卡,然后向下滚动以查找您在证书中提供给组织名称下的证书。现在您应该在您的页面上得到了一个漂亮的绿色锁。
编辑:我在新机器上再次尝试了这个方法,但是证书没有出现在管理证书窗口中,只有通过红色不受信任的证书页面才能实现。我必须执行以下操作:
在带有不受信任证书的页面上(https://
被红色划掉),点击锁图标 > 证书信息。注意:在较新版本的Chrome中,您需要打开 开发者工具 > 安全性
并选择 查看证书
。详细信息
标签页 > 导出
。选择文件格式为 PKCS #7, 单个证书
。颁发机构
标签页 > 导入
,选择您导出证书的文件,并确保选择文件类型为 PKCS #7, 单个证书
。chrome://settings/certificates
。证书部分仅打开 Windows 证书链工具 - Chrome 在 Windows 下似乎没有自己的证书存储。 - feeela99.0.4844.51
上有效。为了保存为PKCS #7单证书,我使用了.p7b
扩展名,并按照这里描述的方式导入。 - lucrp######################
# 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
您可以检查您的工作以确保证书构建正确:
openssl verify -CAfile myCA.pem -verify_hostname bar.mydomain.example mydomain.example.crt
basicConstraints=CA:FALSE
下方添加extendedKeyUsage=serverAuth,clientAuth
,并确保在设置时将"CommonName"设置为与$NAME
相同。将myCA.pem转换为myCA.pfx,执行以下操作:
openssl pkcs12 -export -out myCA.pfx -inkey myCA.key -in myCA.pem
将myCA.pfx导入到Windows的受信任的证书颁发机构中,打开(双击)myCA.pfx文件,选择“本地计算机”,然后点击“下一步”,再次点击“下一步”,输入密码,然后点击“下一步”,选择“将所有证书放入下列存储区:”,点击“浏览”,选择“受信任的根证书颁发机构”,然后点击“下一步”,最后点击“完成”。
$NAME
证书时,它将自动被Windows和Chrome信任。在页面的任何位置单击并输入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)
sendCommand(SecurityInterstitialCommandId.CMD_PROCEED)
- Gedweb从Chrome 58开始,仅使用commonName
无法识别主机。证书现在必须使用subjectAltName
来识别它们的主机。进一步的讨论和bug跟踪器。
如果您过去的自签名证书工作正常,但突然在Chrome 58中出现错误,请注意这一点。
因此,无论您使用何种方法生成自签名证书(或由自签名CA签名的证书),请确保服务器的证书包含一个正确的DNS
和/或IP
条目的subjectAltName
,即使只是针对一个单独的主机。
对于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 下的“安全”选项卡),您应该在 扩展名
下看到它列在 证书主题备用名称
中:
在 Mac 上,您可以使用“钥匙串访问”实用程序将自签名证书添加到系统钥匙串中,然后 Chrome 将接受它。我在这里找到了逐步说明:
Google Chrome、Mac OS X 和自签名 SSL 证书
基本上操作如下:
在 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
,以避免主题备用名称丢失错误如果您想创建一个新的自签名证书,并使用自己的根授权机构完全信任它,可以使用这些脚本完成。
#!/usr/bin/env bash
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
#!/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"
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
要使自签名证书在Chrome和Safari中完全信任,您需要将新的证书颁发机构导入到您的Mac中。请按照以下说明进行操作,或按照 mitmproxy网站上有关此过程的更详细说明进行操作:
您可以通过两种方式之一,在命令行中使用以下命令,该命令会提示您输入密码:
$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain rootCA.pem
或者您可以使用 Keychain Access
应用程序:
额外附赠的内容是:如果您需要让 Java 客户端信任证书,您可以通过将证书导入 Java 密钥库来实现。请注意,这将从密钥库中删除证书(如果已存在),因为它需要更新它以反映可能的变化。当然,这只对导入的证书执行此操作。
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
$ ./create_root_cert_and_key.sh
时,出现了 "Error opening Private Key rootCA.key" 错误。操作系统为 macOS 10.12.4,OpenSSL 版本为 0.9.8zh 14 Jan 2016。 - donut$ ./create_root_cert_and_key.sh
命令之前运行 $ openssl genrsa -out rootCA.key 2048
命令可以解决我遇到的 "Error opening Private Key rootCA.key" 错误。 - donutopenssl req -new -newkey rsa:2048 -sha256 -nodes -keyout device.key -subj "$SUBJECT" -out device.csr
- Lenny如果您正在使用Linux,您也可以遵循官方wiki页面:
基本上:
现在,以下命令将添加证书(其中YOUR_FILE是您导出的文件):
certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n YOUR_FILE -i YOUR_FILE
要列出您的所有证书,请运行以下命令:
certutil -d sql:$HOME/.pki/nssdb -L
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]
使用--auto-ssl-client-auth
参数运行Chrome
google-chrome --auto-ssl-client-auth
download_cert.sh
可以简单地写成这样:echo | openssl s_client -connect $1:443
。 - Paul Tobias"P,,"
来使其工作,但最终成功使用CT,c,c
使其工作。 - Joseph更新于2017年11月:这个答案可能不适用于大多数更新版本的Chrome。
更新于2016年02月:Mac用户可以在这里找到更好的说明。
在想要添加的网站上,右键点击地址栏中的红色锁形图标:
点击标签页连接,然后点击证书信息
点击详细信息标签页,然后点击复制到文件...按钮。这将打开证书导出向导,请点击下一步以跳转至导出文件格式屏幕。
选择DER 编码的二进制 X.509 (.CER),然后点击下一步
点击浏览...并将文件保存到您的计算机上。给它取一个描述性的名称。点击下一步,然后点击完成。
打开Chrome设置,向下滚动到底部,然后点击显示高级设置...
在HTTPS/SSL下,点击管理证书...
点击受信任的根证书颁发机构标签页,然后点击导入...按钮。这将打开证书导入向导。点击下一步以跳转至导入文件屏幕。
点击浏览...并选择您之前保存的证书文件,然后点击下一步。
选择将所有证书放入以下存储。所选的存储应该是受信任的根证书颁发机构。如果不是,请点击浏览...并选择它。点击下一步和完成
在安全警告上点击是。
重新启动Chrome。
certmgr.msc
来添加和删除证书。 - Pacerier更新于2020年4月23日
在错误页面中输入一个秘密的绕过短语即可使Chrome忽略安全错误:thisisunsafe(在早期版本的Chrome中,输入badidea,甚至更早的版本中,输入danger)。除非你完全理解为什么需要使用它,否则不要使用!
来源:
https://chromium.googlesource.com/chromium/src/+/d8fc089b62cd4f8d907acff6fb3f5ff58f168697%5E%21/
(Note thatwindow.atob('dGhpc2lzdW5zYWZl')
resolves to thisisunsafe
)window.atob
函数可以在JS控制台中执行。https://bugs.chromium.org/p/chromium/issues/detail?id=581189
对于快速的单次操作,如果“继续前进”选项不可用,也无法使用绕过短语,则此黑客技巧效果很好:
启用此标志,允许来自 localhost
的证书错误(注意,在更改标志值后,Chrome 需要重新启动):
chrome://flags/#allow-insecure-localhost
(并且投票支持 @Chris 的答案 https://dev59.com/PGsz5IYBdhLWcg3w6MNS#31900210)
如果您要连接的站点是 localhost
,则已完成。否则,请在本地侦听端口 8090 上设置 TCP 隧道,并在端口 443 上连接到 broken-remote-site.com
,确保已安装 socat
并在终端窗口中运行以下命令:
socat tcp-listen:8090,reuseaddr,fork tcp:broken-remote-site.com:443
在浏览器中转到 https://localhost:8090。
下载并安装ngrok,然后通过ngrok.io
公开它:
ngrok http https://localhost
net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM
。请注意,这里的翻译并没有改变原文的意思。 - Seldom 'Where's Monica' Needy