我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
当前回答
我成功地遵循了凯伦的回答,并得到了托比·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更新的步骤。
其他回答
您确定站点的地址与证书相同吗?我对Chrome和自签名证书也有同样的问题,但最后我发现它对证书上域名的验证非常挑剔(应该如此)。
Chrome没有自己的证书存储,而是使用Windows自己的证书。然而,Chrome不提供将证书导入商店的方法,因此您应该通过IE添加证书。
在Google Chrome中安装证书
在Internet Explorer中安装证书
还可以看看这两种不同的创建自签名证书的方法(我假设您使用的是您没有提到的IIS)。
如何在IIS 7中创建自签名证书
这对我有用:
使用Chrome,通过HTTPS点击服务器上的一个页面,然后继续浏览红色警告页面(假设你还没有这样做)。打开Chrome设置>显示高级设置>HTTPS/SSL>管理证书。单击“颁发机构”选项卡,然后向下滚动以在您为证书提供的“组织名称”下查找您的证书。选择它,单击“编辑”(注意:在最新版本的Chrome中,该按钮现在是“高级”而不是“编辑”),选中所有框并单击“确定”。您可能需要重新启动Chrome。
你现在应该在你的页面上获得漂亮的绿色锁。
编辑:我在新计算机上再次尝试了此操作,但仅从红色的不受信任证书页面继续,证书就没有显示在“管理证书”窗口中。我必须做到以下几点:
在具有不受信任证书的页面(https://用红色划掉)上,单击锁>证书信息。注意:在较新版本的chrome上,您必须打开“开发人员工具”>“安全”,然后选择“查看证书”。单击“详细信息”选项卡>“导出”。选择PKCS#7,单一证书作为文件格式。然后按照我的原始说明进入“管理证书”页面。单击“权限”选项卡>“导入”,然后选择将证书导出到的文件,并确保选择PKCS#7,单一证书作为文件类型。如果提示证书存储,请选择受信任的根证书颁发机构选中所有复选框并单击“确定”。重新启动Chrome。
我也遇到了同样的问题:我已将证书安装到Windows的Trusted Root Authorities存储中,但Chrome仍然拒绝证书,错误为ERR_CERT_COMMON_NAME_INVALID。请注意,当证书未正确安装在存储中时,错误为ERR_CERT_AUTHORITY_INVALID。
正如错误名称、此注释和此问题所暗示的,问题在于证书中声明的域名。当生成证书时提示输入“CommonName”时,我必须输入用于访问站点的域名(在我的情况下是localhost)。我使用重新启动了Chromechrome://restart它终于对这个新证书感到满意。
要在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.msc。然后按照下面的屏幕截图将新创建的证书拖放到Trusted Root Certification Authority\Certificates存储区。
只需要5个openssl命令,就可以完成这一任务。
(请不要更改浏览器安全设置。)
使用以下代码,您可以(1)成为自己的CA,(2)然后将SSL证书签署为CA。(3)然后将CA证书(而不是服务器上的SSL证书)导入Chrome/Chrum。(是的,即使在Linux上也可以。)
注意:对于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
概括如下:
成为CA使用CA cert+密钥签署证书在您的Chrome设置(设置>管理证书>权限>导入)中将myCA.pem作为“权限”(而不是“您的证书”)导入使用服务器中的$NAME.crt和$NAME.key文件
额外步骤(至少适用于Mac):
在“文件>导入文件”中导入CA证书,然后在列表中找到它,右键单击它,展开“>信任”,然后选择“始终”在basicConstraints=CA:FALSE下面添加extendedKeyUsage=serverAuth,clientAuth,并确保在请求设置时将“CommonName”设置为与$NAME相同
您可以检查您的工作以确保正确生成证书:
openssl verify -CAfile myCA.pem -verify_hostname bar.mydomain.example mydomain.example.crt