我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
当前回答
您确定站点的地址与证书相同吗?我对Chrome和自签名证书也有同样的问题,但最后我发现它对证书上域名的验证非常挑剔(应该如此)。
Chrome没有自己的证书存储,而是使用Windows自己的证书。然而,Chrome不提供将证书导入商店的方法,因此您应该通过IE添加证书。
在Google Chrome中安装证书
在Internet Explorer中安装证书
还可以看看这两种不同的创建自签名证书的方法(我假设您使用的是您没有提到的IIS)。
如何在IIS 7中创建自签名证书
其他回答
在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
当单击URL旁边的小划掉的锁定图标时,您将看到一个如下所示的框:
单击证书信息链接后,您将看到以下对话框:
它告诉哪个证书存储是正确的,它是受信任的根证书颁发机构存储。
您可以使用其他答案中列出的方法之一将证书添加到该存储,也可以使用:
certutil -addstore -user "ROOT" cert.pem
ROOT是前面提到的证书存储的内部名称。cert.pem是自签名证书的名称。
我该怎么做才能让Chrome接受证书并停止抱怨?
您应该使用以下项创建PKI:;
自签名根CA。子/中间证书[由根CA签署]。正常/最终实体证书[由根CA或子CA签名]commonName或subjectAltName(SAN)作为“localhost”。还包括https://localhost/作为SAN中的URI。将该根CA作为“受信任的根证书颁发机构”导入/安装到Windows操作系统中。因为你提到了IE:Google Chrome在寻找证书链时使用了相同的资源。将该最终实体证书安装为您的web服务器证书,它将停止抱怨该错误消息。
希望这有帮助。
我成功地遵循了凯伦的回答,并得到了托比·J的重要更新,但我不得不做出修改:
创建自签名证书时,必须将新的subjectAltName字段放在v3_ca扩展下,而不是v3_req。我将/etc/ssl/openssl.conf复制到一个临时文件中,然后在[v3_ca]下添加了一行subjectAltName=DNS:*.example.com。然后将该文件传递给cert创建命令,类似于
openssl req -x509 -nodes -newkey rsa:2048 \
-config /tmp/openssl-revised.cfg \
-keyout example.com.key -out example.com.crt
并遵循kellen更新的步骤。
我不得不调整macosx上的Chrome启动程序,并添加了以下脚本。保存如下:;
/应用程序/Google\Chrome.app/Contents/MacOS/Chrome.com命令
#!/bin/sh
RealBin="Google Chrome"
AppDir="$(dirname "$0")"
exec "$AppDir/$RealBin" --ignore-certificate-errors "$@"
当我用这个脚本启动Chrome时,自签名证书可以正常工作。但是,不要使用使用此脚本启动的浏览器浏览网页,您将不会收到有关无效证书的警告!