我为localhost CN创建了一个自签名SSL证书。 Firefox正如预期的那样在最初抱怨之后接受此证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储区之后也是如此。即使我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时列出的证书已正确安装,但仍然坚持认证证书不可信。
我该怎么办才能让Chrome接受证书并停止抱怨?
仅适用于localhost
:
只需将其粘贴到您的chrome中:
chrome://flags/#allow-insecure-localhost
您应该看到突出显示的文本说:允许从localhost加载的资源的无效证书
点击Enable
。
更新于4月3/2018
有一个秘密旁路短语,可以输入错误页面,让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.js,window.atob
函数可以在JS控制台中执行。
有关Chrome团队为何更改旁路短语(第一次)的背景知识:
https://bugs.chromium.org/p/chromium/issues/detail?id=581189
如果没有“Proceed Anyway”选项,旁路短语不起作用,那么快速一次性,这个hack很好用:
localhost
的证书错误(注意Chrome在更改标志值后需要重新启动):
chrome://flags/#allow-insecure-localhost
(和@Chris投票回答https://stackoverflow.com/a/31900210/430128)localhost
,那么您已经完成了。否则,设置TCP隧道以在本地侦听端口8090并连接到端口443上的broken-remote-site.com
,确保安装了socat
并在终端窗口中运行如下操作:
socat tcp-listen:8090,reuseaddr,fork tcp:broken-remote-site.com:443
对于测试环境
启动chrome时可以使用--ignore-certificate-errors
作为命令行参数(在Ubuntu上使用版本28.0.1500.52)。
这将导致它忽略错误并在没有警告的情况下连接。如果您已经运行了chrome版本,则需要在从命令行重新启动之前关闭它,否则它将打开一个新窗口但忽略这些参数。
我将Intellij配置为在进行调试时以这种方式启动chrome,因为测试服务器永远不会有有效的证书。
我不建议这样的正常浏览,因为证书检查是一个重要的安全功能,但这可能对某些人有所帮助。
有人注意到,您需要重新启动所有Chrome,而不仅仅是浏览器窗口。最快的方法是打开一个选项卡...
chrome://restart
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”,但我仍然得到相同的错误:
但我意识到我应该导入root权限证书而不是域名证书。所以我使用了mmc控制台(文件/添加或删除管理单元/证书/添加/计算帐户/本地计算机/确定)我在受信任的根证书颁发机构存储中导入了rootCA.pem。
重启Chrome和etvoilà它有效。
使用localhost:
或者使用IP地址:
我唯一无法实现的是,它有过时的密码(图片上的红色方块)。在这一点上,对此表示赞赏。
使用makecert,无法添加SAN信息。使用New-SelfSignedCertificate(Powershell),您可以添加SAN信息,它也可以使用。
您确定该网站的地址与证书相同吗?我在使用Chrome和自签名证书方面遇到了同样的问题,但最后我发现它对证书上域名的验证非常挑剔(应该是这样)。
Chrome没有自己的证书商店,并使用Window自己的。但是,Chrome无法将证书导入商店,因此您应该通过IE添加它们。
Installing Certificates in Google Chrome
Installing Certificates in Internet Explorer
另外,请看一下创建自签名证书的几种不同方法(我假设您正在使用IIS,因为您没有提到过)。
单击URL旁边的小划线锁图标时,您将看到如下所示的框:
单击“证书信息”链接后,您将看到以下对话框:
它告诉您哪个证书存储是正确的,它是受信任的根证书颁发机构存储。
您可以使用其他答案中列出的方法之一将证书添加到该商店或使用:
certutil -addstore -user "ROOT" cert.pem
ROOT
是前面提到的证书存储的内部名称。cert.pem
是您自签名证书的名称。我使用了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
您需要关注如何获取证书文件的博客,之后您可以使用上面的命令并且应该很好。
这篇文章已经充满了回复,但我根据其他一些答案创建了一个bash脚本,以便更容易生成在Chrome中有效的自签名TLS证书(在Chrome 65.x
中测试)。希望它对其他人有用。
安装(并信任)证书后,不要忘记重新启动Chrome(chrome://restart
)
值得一试的另一个工具是CloudFlare的cfssl
工具包:
用于在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
从Chrome 58+开始,由于缺少SAN,我开始在macOS上获得证书错误。以下是如何再次获取地址栏上的绿色锁定。
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
server.crt
导入KeyChain,然后双击证书,展开Trust,并选择Always Trust刷新Google Chrome中的页面https://domain.dev,以便绿色锁定恢复。
这对我有用:
Chrome Settings > Show advanced settings > HTTPS/SSL > Manage Certificates
。Authorities
选项卡并向下滚动以在您为证书提供的组织名称下找到您的证书。你现在应该在你的页面上得到漂亮的绿色锁。
编辑:我在一台新机器上再次尝试了这一点,只是从红色不受信任的证书页面继续,证书没有出现在“管理证书”窗口中。我必须做以下事情:
https://
以红色划掉),单击锁定>证书信息。注意:在较新版本的chrome上,您必须打开Developer Tools > Security
,然后选择View certificate
。Details tab > Export
。选择PKCS #7, single certificate
作为文件格式。Authorities tab > Import
并选择导出证书的文件,并确保选择PKCS #7, single certificate
作为文件类型。我不得不在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时,自签名证书可以正常运行。但是不要使用使用此脚本启动的浏览器浏览网页,您将不会收到有关无效证书的警告!
这对我有用。见:http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/#.Vcy8_ZNVhBc
在地址栏中,单击带有X的小锁。这将显示一个小信息屏幕。单击“证书信息”按钮。
单击并将图像拖动到桌面。它看起来像一个小证书。
双击它。这将打开Keychain Access实用程序。输入您的密码以解锁它。
确保将证书添加到系统密钥链,而不是登录密钥链。点击“始终信任”,即使这似乎没有做任何事情。
添加完毕后,双击它。您可能需要再次进行身份验证。
展开“信任”部分。
“使用此证书时,”设置为“始终信任”
这是不断出现的 - 特别是对于Mac OS X Yosemite上的谷歌浏览器!
值得庆幸的是,我们的一个开发团队今天向我发送了此链接,该方法可靠地工作,同时仍然允许您控制您接受证书的站点。
jersully帖子:
如果你不想打扰内部证书......
- 在地址栏中输入
chrome://flags/
。- 滚动或搜索“记住”决策,以便在指定的时间内完成SSL错误。
- 选择记住三个月。
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中。
我自己解决了这个问题,而没有在任何具有适当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
快乐的编码!
当我尝试在浏览器中导入证书时,它对我不起作用...在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 !!!
祝好运! ;)
对于MacOS上的Chrome,如果您准备了证书:
mac / osx上的SSL / HTTPS localhost修复:
修复Windows上的Chrome。
首先,您需要导出证书。
要导入
在Mac上,您可以使用Keychain Access实用程序将自签名证书添加到系统钥匙串,然后Chrome将接受它。我在这里找到了分步说明:
Google Chrome, Mac OS X and Self-Signed SSL Certificates
基本上:
为了在Windows上进行开发,您可以
添加到Chrome快捷方式标志--ignore-certificate-errors
它希望忽略证书错误并允许您访问无效的证书网站。 https://support.opendns.com/entries/66657664中更详细的说明。
更新58+更新(续期2017-04-19)
从Chrome 58开始,仅使用commonName
is being removed识别主机。查看更多discussion here和bug 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
:
单击页面上的任意位置并键入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'));
更新11月11日:这个答案可能不适用于大多数较新版本的Chrome。
更新02/2016:可以找到更好的Mac用户说明Here。
如果您使用的是Linux,也可以按照以下官方维基页面进行操作:
基本上:
现在,以下命令将添加证书(其中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]
--auto-ssl-client-auth
参数运行Chrome
google-chrome --auto-ssl-client-auth
在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
, to avoid subject alternative name missing errors如果要使用自己的root权限创建一个完全受信任的新自签名证书,则可以使用这些脚本执行此操作。
#!/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=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"
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
要允许在Chrome和Safari中完全信任自签名证书,您需要将新的证书颁发机构导入Mac。为此,请遵循这些说明,或有关此一般过程on the mitmproxy website的更详细说明:
您可以在命令行中执行以下两种方法之一,使用此命令将提示您输入密码:
$ 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
如果您使用的是Mac而没有看到导出选项卡或如何获取证书,这对我有用:
现在重新加载有问题的页面,它应该是问题解决了!希望这可以帮助。
为了使这更容易一些,您可以使用以下脚本(source):
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
chmod +x whitelist_ssl_certificate.ssh
./whitelist_ssl_certificate.ssh https://your_website/whatever