我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
当前回答
更新日期:2020年4月23日
铬团队推荐
https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins#TOC-测试强大功能
快速超级简单解决方案
有一个秘密的绕过短语,可以在错误页面中输入,让Chrome不顾安全错误继续运行:这是不安全的(在早期版本的Chrome中,键入baddidea,甚至更早版本的危险)。除非你完全明白为什么需要它,否则不要使用它!
资料来源:
https://chromium.googlesource.com/chromium/src/+/d8fc089b62cd4f8d907acff6fb3f5ff58f168697%5E%21/
(注意,window.atob('dGhpc2lzdW5zYWZl')解析为此isnsafe)
源的最新版本为@https://chromium.googlesource.com/chromium/src/+/refs/heads/master/components/security_interentials/corebrowser/resources/intertial_large.js和window.atob函数可以在js控制台中执行。
有关Chrome团队为何更改旁路短语(第一次)的背景信息:
https://bugs.chromium.org/p/chromium/issues/detail?id=581189
如果所有其他方法都失败(解决方案1)
对于快速一次性,如果“无论如何继续”选项不可用,或者旁路短语也不起作用,这个黑客很好:
通过启用此标志,允许来自本地主机的证书错误(注意,更改标志值后,Chrome需要重新启动):chrome://flags/#allow-不安全的本地主机(并投票赞成答案https://stackoverflow.com/a/31900210/430128作者@Chris)如果要连接的站点是localhost,那么就完成了。否则,设置TCP隧道以在本地侦听端口8090,并连接到端口443上的broken-remote-site.com,确保已安装socat并在终端窗口中运行以下内容:socat tcp侦听:8090,reuseddr,fork tcp:断开远程站点.com:443去https://localhost:8090在浏览器中。
如果所有其他方法都失败(解决方案#2)
类似于“如果所有其他都失败(解决方案#1)”,这里我们使用ngok为本地服务配置代理。因为您可以通过TLS访问ngrok http隧道(在这种情况下,它由ngrok使用有效证书终止),也可以通过非TLS端点访问,所以浏览器不会抱怨证书无效。
下载并安装ngrok,然后通过ngrok.io公开它:
ngrok http https://localhost
ngok将启动并为您提供一个可以连接到的主机名,所有请求都将通过隧道传输回本地计算机。
其他回答
这对我有用:
使用Chrome,通过HTTPS点击服务器上的一个页面,然后继续浏览红色警告页面(假设你还没有这样做)。打开Chrome设置>显示高级设置>HTTPS/SSL>管理证书。单击“颁发机构”选项卡,然后向下滚动以在您为证书提供的“组织名称”下查找您的证书。选择它,单击“编辑”(注意:在最新版本的Chrome中,该按钮现在是“高级”而不是“编辑”),选中所有框并单击“确定”。您可能需要重新启动Chrome。
你现在应该在你的页面上获得漂亮的绿色锁。
编辑:我在新计算机上再次尝试了此操作,但仅从红色的不受信任证书页面继续,证书就没有显示在“管理证书”窗口中。我必须做到以下几点:
在具有不受信任证书的页面(https://用红色划掉)上,单击锁>证书信息。注意:在较新版本的chrome上,您必须打开“开发人员工具”>“安全”,然后选择“查看证书”。单击“详细信息”选项卡>“导出”。选择PKCS#7,单一证书作为文件格式。然后按照我的原始说明进入“管理证书”页面。单击“权限”选项卡>“导入”,然后选择将证书导出到的文件,并确保选择PKCS#7,单一证书作为文件类型。如果提示证书存储,请选择受信任的根证书颁发机构选中所有复选框并单击“确定”。重新启动Chrome。
为了在Windows上进行开发,您可以添加到Chrome快捷方式标志--忽略证书错误
它希望忽略证书错误,并允许您访问无效的证书网站。中更详细的说明https://support.opendns.com/entries/66657664.
我也遇到了同样的问题:我已将证书安装到Windows的Trusted Root Authorities存储中,但Chrome仍然拒绝证书,错误为ERR_CERT_COMMON_NAME_INVALID。请注意,当证书未正确安装在存储中时,错误为ERR_CERT_AUTHORITY_INVALID。
正如错误名称、此注释和此问题所暗示的,问题在于证书中声明的域名。当生成证书时提示输入“CommonName”时,我必须输入用于访问站点的域名(在我的情况下是localhost)。我使用重新启动了Chromechrome://restart它终于对这个新证书感到满意。
如果你在mac上,没有看到导出选项卡或如何获取证书,这对我来说很有用:
单击https://转到“连接”选项卡单击“证书信息”现在您应该看到:将这个小证书图标拖到桌面上(或任何地方)。双击下载的.cer文件,这应该会将其导入到密钥链中,并打开密钥链访问证书列表。在某些情况下,这就足够了,您现在可以刷新页面了。否则:双击新添加的证书。在信任下拉列表下,将“使用此证书时”选项更改为“始终信任”
现在重新加载有问题的页面,问题应该解决了!希望这有帮助。
从Wolph编辑
为了使此操作更简单,可以使用以下脚本(源代码):
将以下脚本另存为whitelist_ssl_certificate.ssh:#!/usr/bin/env bash-eSERVERNAME=$(echo“$1”|sed-E-E's/https?:\\///'-E's/\/.*//')echo“$SERVERNAME”如果[[“$SERVERNAME”=~.*\..*]];然后echo“为$SERVERNAME添加证书”echo-n | openssl s_client-connect$SERVERNAME:443 | sed-ne'/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'|tee/tmp/$SERVERNAME.certsudo安全添加可信证书-d-r trustRoot-k“/Library/Keychains/System.keychain”/tmp/$SERVERNAME.cert其他的echo“用法:$0 www.site.name”echo“http://等将自动剥离”传真使脚本可执行(从shell):chmod+x白名单_ssl_证书.ssh运行所需域的脚本(只需复制/粘贴完整的url即可):./whitelist_ssl_certificate.sshhttps://your_website/whatever
在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,以避免主题替代名称丢失错误
如果您想使用自己的根权限创建一个完全受信任的新的自签名证书,可以使用这些脚本。
创建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
为域.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应用程序:
打开钥匙链访问在“钥匙链”列表中选择“系统”在“类别”列表中选择“证书”选择“文件|导入项目…”浏览到上面创建的文件“rootCA.pem”,选择它,然后单击“打开”在“证书”列表中选择新导入的证书。单击“i”按钮,或右键单击证书,然后选择“获取信息”展开“信任”选项将“使用此证书时”更改为“始终信任”关闭对话框,系统将提示您输入密码。关闭并重新打开使用目标域的所有选项卡,它将被安全加载!
另外,如果您需要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