使Chrome接受自签名的本地主机证书


1203

我已经为本地主机CN创建了一个自签名SSL证书。如预期的那样,Firefox在最初抱怨它之后接受了该证书。但是,即使将证书添加到“受信任的根”下的系统证书存储中,Chrome和IE也拒绝接受它。即使我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时列出的证书已正确安装,它仍然坚持认为证书不可信任。

我应该怎么做才能让Chrome接受证书并停止抱怨呢?


13
当您说Firefox最初抱怨它时,是否表示它要求您添加证书例外?如果正确安装了证书,则不会发生这种情况。在我看来,所有三种浏览器都在抱怨,但是Firefox允许您取消它的抱怨。我将其发布为评论,因为我没有具体的答案,但我确实做到了这一点,并且在所有三种浏览器中都可以正常工作。我建议您先尝试使其在IE上运行,然后再高兴地担心其他两个。对不起,我帮不上什么忙!
starkythehutch

1
您必须创建一个格式正确的证书,包括显示DNS名称的方式。OpenSSL不会以开箱即用的方式满足浏览器的要求。请参阅如何使用openssl创建自签名证书?
jww 2015年

4
火狐也不能使用系统证书存储区。
curiousguy 2015年

4
如果您的证书签名使用SHA-1,即使您已经成功添加了自定义证书,Chrome的最新版本(大约57)也会显示警告。无论如何,开发人员工具的“安全性”面板将更具体地说明问题所在,例如:net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM
SeldomNeedy

2
我只是出于开发目的停止使用Chrome,因为它对开发人员不友好。通常情况下,最终遇到这种情况的人都会知道自己在做什么。谢谢,但是不,谢谢。我对Chrome感到很沮丧!
GTodorov

Answers:


63

2020-05-22仅需6个 shell命令,即可完成此操作。

不要更改您的浏览器安全设置。

使用以下代码,您可以(1)成为自己的CA,(2)然后将SSL证书签名为CA。(3)然后将CA证书(而不是SSL证书,该证书到您的服务器上)导入Chrome / Chromium。(是的,即使在Linux上也可以。)

######################
# 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.com # 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

回顾一下:

  1. 成为CA
  2. 使用CA密钥签署证书
  3. myCA.pem在您的Chrome设置中以授权方式导入(设置>管理证书>权限>导入)
  4. 使用.crt服务器中的文件

额外步骤(至少适用于Mac):

  1. 在“文件>导入文件”中导入CA证书,然后在列表中找到它,右键单击它,展开“>“信任”,然后选择“始终”
  2. extendedKeyUsage=serverAuth,clientAuth在下面添加basicConstraints=CA:FALSE,并确保将“ CommonName”设置为与$NAME要求设置时相同

你可以检查你的工作

openssl verify -CAfile myCA.pem -verify_hostname bar.mydomain.com mydomain.com.crt

2
@maverick浏览器和操作系统附带受信任的有限数量的CA。尽管任何人都可以成为CA,但是要使任何人信任他们的证书,他们需要人们手动将其添加为受信任的CA(就像我们告诉Chrome在手动导入证书时一样)。
JellicleCat

2
大!两个讲话为Mac用户和我一样:在最后一行,使用-days 825的,而不是-days 1825由于superuser.com/questions/1492643/...,而且值得注意的是,导入根证书到钥匙链访问,你不仅需要“文件>导入文件”,然后也在列表中找到它,右键单击它,展开“>信任”,然后选择“始终”。
michielbdejong

2
如果您的本地开发服务器需要PEM文件而不是CRT文件,请不要担心,只需组合.crt.csr文件并将它们另存为.pem文件,就可以了。
KeremBaydoğan

1
终于成功了!布拉沃这个答案。请不要忘记将myCA.pem加载到您的Chrome或Firefox(“设置”>“管理证书”>“授权”>“导入”)
Fryser

3
我将基于IP的LAN服务器的DNS.1更改为IP.1。有用。谢谢。
dw1

763

对于localhost只:

只需将其粘贴到您的Chrome中:

chrome://flags/#allow-insecure-localhost

您应该看到突出显示的文字:允许从本地主机加载的资源使用无效证书

点击Enable



4
如果您在隐身模式下使用chrome(例如用于切换身份),则此方法将不起作用,但否则会非常干净
baywet

5
这-如果您能忍受烦人的红色“不安全”消息。否则,将是数小时的opensl咒语,然后尝试与Chrome中的内部证书管理器打交道。
timbo,

10
我不知道为什么对这个答案进行了投票,但是无效证书和自签名证书之间有区别。问题是关于自签名证书。
Mehdi

2
根本没有为我工作。对我有用的是生成一个包括subjectAltName的自签名证书,如以下答案所述:stackoverflow.com/a/42917227/2873507
Vic Seedoubleyew

507

这为我工作:

  1. 使用Chrome浏览器,通过HTTPS在服务器上点击一个页面,然后继续经过红色警告页面(假设您尚未执行此操作)。
  2. 打开Chrome Settings > Show advanced settings > HTTPS/SSL > Manage Certificates
  3. 单击Authorities选项卡,然后向下滚动以在您授予证书的组织名称下找到证书。
  4. 选择它,单击“编辑”(注意:在最新版本的Chrome中,该按钮现在为“高级”,而不是“编辑”),选中所有复选框,然后单击“确定”。您可能必须重新启动Chrome。

您现在应该在页面上看到漂亮的绿色锁。

编辑:我在新计算机上再次尝试了此操作,仅通过从红色不受信任的证书页面继续进行操作,证书就没有出现在“管理证书”窗口中。我必须执行以下操作:

  1. 在带有不受信任的证书的页面上(https://用红色划出红色标记),单击锁>证书信息。注意:在较新版本的chrome上,您必须打开Developer Tools > Security,然后选择View certificate
  2. 点击Details tab > Export。选择PKCS #7, single certificate作为文件格式。
  3. 然后按照我的原始说明进入“管理证书”页面。单击,Authorities tab > Import然后选择将证书导出到的文件,并确保选择 PKCS #7, single certificate 作为文件类型
  4. 如果提示存储证书,请选择“ 受信任的根证书颁发机构”
  5. 选中所有框,然后单击确定。重新启动Chrome。

143
我在Linux机器上尝试了此操作,但是它说导入失败,因为xxx.xxx.com:不是证书颁发机构。
马特2013年

15
感谢@kellen ..但是,使用Chrome版本29.0.1547.57 beta,证书信息上的任何地方似乎都没有“导出”选项。就是说,有一个“详细信息” 部分,但它不是选项卡形式的。它显示为可折叠/可扩展块。 i.imgur.com/dDmNEIh.png
骑兵

20
在Chrome 37中,不再有有用的描述性Export按钮,该按钮似乎已被替换为精美的Copy to file按钮。为什么不遵守“出口”原则,思想
却步履蹒跚

13
@Jakobud,只需将证书符号拖到桌面或其他内容上,就可以将其导出。但是,据我所知(Chrome 39),其余答案在OS X(Yosemite)上不起作用。
db 2015年

33
从Chrome 56开始,要访问Windows中的SSL证书设置,您必须使用开发者工具(CTRL + SHIFT + i),转到“安全性”标签,然后单击“查看证书”按钮。
void.pointer

167

CHROME 58+的更新(已发布2017-04-19)

从Chrome 58开始,commonName 删除了仅使用识别主机的功能。现在必须使用证书subjectAltName来标识其主机。在此处查看更多讨论,在此处查看错误跟踪器。过去,subjectAltName它仅用于多主机证书,因此某些内部CA工具不包含它们。

如果您的自签名证书过去运行良好,但突然开始在Chrome 58中生成错误,这就是原因。

因此,无论您使用哪种方法生成自签名证书(或由自签名CA签名的证书),都应确保服务器的证书包含subjectAltName带有正确DNS和/或IP条目/条目的,即使该证书仅用于单个主机

对于openssl,这意味着您的OpenSSL配置/etc/ssl/openssl.cnf在Ubuntu上)应具有与单个主机类似的内容:

[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“安全”选项卡上),你应该看到它下面列出ExtensionsCertificate Subject Alternative Name

Chrome证书查看器


12
感谢您发布有关Chrome 58+更新的信息!对于希望在Windows中创建包含SAN的自签名证书的人,一种简单的方法是使用New-SelfSignedCertificate PowerShell小命令。 New-SelfSignedCertificate -DnsName localhost -CertStoreLocation cert:\LocalMachine\My
DanO

3
@DanO谢谢!在Win10上,没有其他解决方法对我有用。很高兴至少知道Powershell会生成有效的证书!
Brian Donahue

1
在Reddit上找到了适用于Chrome 58+的解决方案,它可以正常工作!在管理员命令提示符下:reg添加HKLM \ Software \ Policies \ Google \ Chrome / v EnableCommonNameFallbackForLocalAnchors / t REG_DWORD / d 1
IrfanClemson

3
要在Linux上创建策略,您需要创建一个策略文件,/etc/opt/chrome/policies/managed/EnableCommonNameFallbackForLocalAnchors.json内容如下: { "EnableCommonNameFallbackForLocalAnchors": true }
seanf

5
“在Chrome的证书查看器(已移至F12下的“安全”标签)中,您应该看到它显示ExtensionsCertificate Subject Alternative Name“。在F12开发人员工具(Chrome 62)中打开“安全性”标签时,没有看到“扩展”部分。它已经移到其他地方了吗?
Thunderforge

142

在Mac上,您可以使用“钥匙串访问”实用程序将自签名证书添加到“系统”钥匙串中,然后Chrome会接受它。我在这里找到了分步说明:

Google Chrome,Mac OS X和自签名SSL证书

基本上:

  1. 双击带有X的锁图标,然后将证书图标拖放到桌面上,
  2. 打开此文件(扩展名为.cer);这将打开钥匙串应用程序,使您可以批准证书。

12
重要的是,您可能需要重新启动Chrome才能生效。
熊加米奥夫2014年

10
我不得不编辑证书首选项并手动信任SSL
NeDark

1
这对我来说适用于Yosemite(10.10.5),Chrome版本46.0.2490.80(64位)。谢谢!
罗勒姆2015年

2
在El Capitan上工作,无需重新启动。我添加了证书,单击了它,展开了“信任”下拉列表,并将其设置Always Trust为“ SSL”部分。基本上是@NeDark说的。
汤姆(Tom)”

1
我需要将证书从桌面拖放到“钥匙串”中,然后进行批准。
jmq,

129

单击页面上的任意位置,然后键入BYPASS_SEQUENCE

thisisunsafe”是适用于Chrome 65版的BYPASS_SEQUENCE

badidea” Chrome版本62-64。

danger”曾经在早期版本的Chrome中运行

您无需查找输入字段,只需键入它即可。感觉很奇怪,但是正在工作。

我在Mac High Sierra上尝试过。

要再次检查他们是否再次更改,请转到最新的铬源代码

要查找BYPASS_SEQUENCE,目前看起来像这样:

var BYPASS_SEQUENCE = window.atob('dGhpc2lzdW5zYWZl');

现在,它们已经被伪装了,但是要查看真正的BYPASS_SEQUENCE,您可以在浏览器控制台中运行以下代码。

console.log(window.atob('dGhpc2lzdW5zYWZl'));

6
wtf,谢谢这对我有用。ubuntu 16.04 63.0.3239.84
gries

8
自新版本以来,此代码已更改。新短语是thisisunsafe
The Java Guy

6
在Windows 10上的Chrome 65中,键入thisisunsafe似乎只会对该站点添加到例外产生影响。(地址栏仍用红色显示“不安全”。)
瑞安

2
这是有效的,但仅适用于首次加载,如果您浏览页面,则必须再次键入bupass_squence
talsibony

“ thisisunsafe” BYPASS_SEQUENCE是该页面上唯一在Mac Chrome 72上适用于我的东西。我觉得我无需费心创建我的自签名证书...!

95

的Linux

如果您使用的是Linux,则还可以遵循以下官方Wiki页面:

基本上:

  • 点击带有X的锁形图标,
  • 选择证书信息
  • 转到详细信息选项卡
  • 单击导出...(另存为文件)

现在,以下命令将添加证书(其中YOUR_FILE是您的导出文件):

certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n YOUR_FILE -i YOUR_FILE

要列出所有证书,请运行以下命令:

certutil -d sql:$HOME/.pki/nssdb -L

如果仍然无法正常工作,则可能会受到以下错误的影响: 问题55050:Ubuntu SSL错误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


太好了,我喜欢你的剧本。但是,您不需要QUIT(无论如何都没有QUIT这样的HTTP命令),也不需要sed,nss工具可以过滤出BEGIN和END CERT之间的证书。因此,download_cert.sh可能就是这样:echo | openssl s_client -connect $1:443
Paul Tobias

我尝试了其他选项,但目前只有该选项可在适用于Linux的Chrome 4x中使用,它拒绝使用内置工具将其导入任何商店。
肯德里克

93

在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,以避免主题备用名称丢失错误

如果要创建一个新的自签名证书,该证书将使用您自己的根权限进行完全信任,则可以使用以下脚本来进行此操作。

create_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

create_certificate_for_domain.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应用程序:

  1. 开放式钥匙串访问
  2. 在“钥匙串”列表中选择“系统”
  3. 在“类别”列表中选择“证书”
  4. 选择“文件|导入项目...”
  5. 浏览到上面创建的文件“ rootCA.pem”,选择它,然后单击“打开”
  6. 在“证书”列表中选择新导入的证书。
  7. 单击“ i”按钮,或右键单击您的证书,然后选择“获取信息”
  8. 展开“信任”选项
  9. 将“使用此证书时”更改为“始终信任”
  10. 关闭对话框,系统将提示您输入密码。
  11. 关闭并重新打开使用目标域的所有选项卡,它将安全地加载!

另外,如果需要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

运行时出现“打开私钥rootCA.key时出错” $ ./create_root_cert_and_key.sh。macOS 10.12.4和OpenSSL 0.9.8zh 2016
donut

1
在运行$ openssl genrsa -out rootCA.key 2048之前$ ./create_root_cert_and_key.sh修复了我遇到的“打开私钥rootCA.key时出错”错误。
甜甜圈

@donut-感谢您指出这一点-我重复了该行,因此我确定它引起了您所看到的问题...
Brad Parks

openssl req -new -newkey rsa:2048 -sha256 -nodes -key device.key -subj "$SUBJECT" -out device.csr给我一个错误“打开PRivate Key device.key时出错”,我认为应该创建此命令device.key,但由于某种原因,它似乎试图读取它
Lenny

2
想通了解决方案(以防万一有人碰到这个问题)将更-key改为-keyout...openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout device.key -subj "$SUBJECT" -out device.csr
Lenny

90

更新11/2017:此答案可能不适用于大多数较新版本的Chrome。

更新02/2016:可在此处找到针对Mac用户的更好说明。

  1. 在要添加的站点上,右键单击地址栏中的红色锁定图标:在此处输入图片说明

    1. 单击标签为“ 连接”的选项卡,然后单击“ 证书信息”

    2. 单击详细信息选项卡,然后单击复制到文件...按钮。这将打开“证书导出向导”,单击“ 下一步”进入“ 导出文件格式”屏幕。

    3. 选择DER编码的二进制X.509(.CER),单击“ 下一步”。

    4. 单击浏览...,然后将文件保存到计算机。用描述性的名称命名。单击下一步,然后单击完成

    5. 打开Chrome设置,滚动到底部,然后单击显示高级设置...。

    6. HTTPS / SSL下,单击管理证书...。

    7. 单击“ 受信任的根证书颁发机构”选项卡,然后单击“ 导入...” 按钮。这将打开“证书导入向导”。单击“ 下一步”进入“ 要导入文件”屏幕。

    8. 单击浏览...,然后选择您之前保存的证书文件,然后单击下一步

    9. 选择将所有证书放入以下存储中。所选存储应为“ 受信任的根证书颁发机构”。如果不是,请单击浏览...,然后选择它。单击下一步完成

    10. 在安全警告上单击“ ”。

    11. 重新启动Chrome。


2
@AJeneral是的,Chrome再次更改。本文中的说明最近对我有用。
kmgdev 2014年

2
截至此评论发布之日,最新版本的Mac Chrome上不存在此选项。
y3sh 2015年

1
@ kgrote,Chrome没有自己的证书存储区。它所做的就是添加和删除Windows。因此,更好的方法是简单地使用certmgr.msc添加和删​​除证书。
Pacerier,2015年

1
为我工作了,谢谢。必须重新启动Chrome,最重要的是我的证书必须在2017年之前到期。SHA-1内容。
ioanb7'8

1
铬再次改变!现在执行步骤“在地址栏中,用X单击小锁。这将弹出一个小的信息屏幕。” 不起作用。
布鲁诺·布罗诺斯基

59

如果您使用的是Mac,并且看不到“导出”标签或如何获取证书,那么这对我有用:

  1. 单击https://之前的锁
  2. 转到“连接”标签
  3. 点击“证书信息”

    现在您应该看到: 当然,您和您的不同信息应该标记为受信任(否则您可能不会在这里)

  4. 将该小证书图标拖到桌面上(或任何位置)。

  5. 双击已下载的.cer文件,这应将其导入到您的钥匙串中,然后打开“钥匙串访问”以访问您的证书列表。

    在某些情况下,这就足够了,您现在可以刷新页面。

    除此以外:

  6. 双击新添加的证书。
  7. 在信任下拉列表中,将“使用此证书时”选项更改为“始终信任”

现在重新加载有问题的页面,应该可以解决了!希望这可以帮助。


沃尔夫编辑

为了使此操作更容易一些,您可以使用以下脚本(source):

  1. 将以下脚本另存为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
  2. 使脚本可执行(从shell):

    chmod +x whitelist_ssl_certificate.ssh
  3. 为您想要的域运行脚本(只需复制/粘贴完整的URL即可):

    ./whitelist_ssl_certificate.ssh https://your_website/whatever

1
这种方法在OS X Mavericks上对我有用,如上面的最佳答案所述,没有可用的“ 导出”选项。
凯文·利里

效果很好。https之前的锁定仍然无效,但是可以,因为不再有烦人的弹出窗口。
2014年

这在Mac Catalina上为我工作。谢谢!:)
索拉比

58

已更新四月二千〇二十零分之二十三

铬团队推荐

https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins#TOC-Testing-Powerful-Features

快速超级轻松解决方案

尽管存在安全错误,但可以在错误页面中键入一个秘密旁路词组以使Chrome继续运行:thisisunsafe(在Chrome的早期版本中,键入badidea,甚至在更早版本中,危险)。DO NOT使用,除非你明白究竟为什么需要它!

资源:

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

如果所有其他方法都失败(解决方案1)

如果“无论如何继续”选项不可用,或者旁路词组不起作用,那么一次过的快速破解非常有效:

  1. localhost通过启用此标志来允许证书错误(请注意,更改标志值后,Chrome需要重新启动):

    chrome://flags/#allow-insecure-localhost

    (以及@Chris的投票答案https://stackoverflow.com/a/31900210/430128

  2. 如果您要连接的站点是localhost,则操作完成。否则,请设置一个TCP隧道以本地监听8090端口并连接到broken-remote-site.com端口443,确保已socat在终端窗口中安装并运行以下内容:

    socat tcp-listen:8090,reuseaddr,fork tcp:broken-remote-site.com:443

  3. 在浏览器中转到https:// localhost:8090

如果其他所有方法都失败(解决方案2)

类似于“如果其他所有方法都失败(解决方案1)”,在这里我们使用ngrok配置到本地服务的代理。因为您可以通过TLS(在这种情况下它由具有有效证书的ngrok终止)或通过非TLS端点访问ngrok http隧道,所以浏览器不会抱怨无效的证书。

下载并安装ngrok,然后通过ngrok.io以下方式将其公开:

ngrok http https://localhost

ngrok将启动并为您提供一个可以连接的主机名,所有请求都将通过隧道传送回本地计算机。


10
quora.com/…所述,另一种选择是单击页面上的任意位置并输入“ badidea”
smihael

任何试图将localhost与https一起用于服务人员的人,如果一切失败的第一点对我来说就是chrome 60 ubuntu 14.04
formatkaka

这仍将证书视为无效,并使密码管理拒绝工作
Ray Foss

34

对于测试环境

--ignore-certificate-errors在启动chrome时,您可以将其用作命令行参数(在Ubuntu上使用28.0.1500.52版)。

这将导致它忽略错误并进行连接而不会发出警告。如果您已经运行了chrome版本,则需要先关闭此版本,然后再从命令行重新启动,否则它将打开一个新窗口,但忽略参数。

我将Intellij配置为在调试时以这种方式启动chrome,因为测试服务器永远没有有效的证书。

我不建议像这样进行常规浏览,因为证书检查是一项重要的安全功能,但这可能对某些人有所帮助。


5
它在Windows 8中对我有用!我只是右键单击chrome快捷方式>“属性”>更改了“目标”字段,如下所示(请注意,“-ignore-certificate-errors”应在引号后加上空格):“ C:\ Program Files(x86)\ Google \ Chrome \ Application \ chrome.exe“ --ignore-certificate-errors
mikhail-t

1
这不能回答问题,而且很危险。问题是如何让Chrome信任自签名服务器证书;不是如何忽略警告和错误。
jww 2015年

1
这是在Windows 7(64位)的Chrome(63.0.3239.108)上对我有效的唯一解决方案。关于安全性,我在桌面上创建了一个特殊图标,该图标仅在本地虚拟机上开发时才启动。导入自签名本地证书,调整chrome:// flags和HSTS域无济于事。Chrome浏览器肯定应该保留旧的好按钮“添加安全例外”,这将为我节省2个小时的无用设置困扰。
lubosdz


20

正如有人指出的那样,您需要重新启动所有的Chrome,而不仅仅是重新启动浏览器窗口。最快的方法是打开一个选项卡来...

chrome://restart


嘿! 只是想指出,这就是修复它的原因。我在信任库中添加了自定义CA,它一直以这种方式为我工作。我尝试使用Firefox并完美运行,但未使用chrome。最后,这是因为您似乎需要完全重启chrome(如上所述)。只要这些后台进程仍在运行,Chrome可能会一直使用相同的信任库。
Jose Cifuentes

19

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”,但仍然出现相同的错误:

在此处输入图片说明

但是我意识到我应该导入根权限证书而不是域证书。因此,我使用mmc控制台(“文件/添加或删除管理单元/证书/添加/计算机帐户/ LocalComputer / OK”)在“受信任的根证书颁发机构”存储中导入了rootCA.pem。

在此处输入图片说明

重新启动Chrome,然后开始工作。

使用本地主机:

在此处输入图片说明

或使用IP地址:

在此处输入图片说明

我唯一无法实现的是,它具有过时的密码(图片上的红色正方形)。感谢您提供帮助。

使用makecert不可能添加SAN信息。使用New-SelfSignedCertificate(Powershell),您可以添加SAN信息,它也可以工作。


2
重要:以管理员身份运行OpenSSL。
何塞A

截至2019
ShadeBlack

太好了,非常感谢(在Chrome 75上-2019年7月)。netsh http除非您使用Windows Server,否则不需要该步骤。另外,我认为没有必要将证书文件导出到pfx。

确认工作正常:Chrome 81-2020年5月-Windows 7
petrosmm

15
  1. 将CA证书添加到受信任的根CA Store中。

  2. 转到chrome并启用此标志!

chrome://flags/#allow-insecure-localhost

最后,只需使用* .me域或* .com和* .net之类的任何有效域,并将其维护在主机文件中即可。对于我的本地开发人员,我使用* .me或* .com并维护一个主机文件,如下所示:

  1. 添加到主机。C:/ windows / system32 / drivers / etc / hosts

    127.0.0.1 nextwebapp.me

注意:如果在执行此操作时已经打开浏览器,该错误将继续显示。因此,请关闭浏览器,然后重新启动。更好的是,隐身或开始新的会话以立即生效。



我仅将本地开发中允许的域名(即* .me网站)添加到Windows中的主机文件中。人们添加了证书,但有时即使证书安装正确,主机也无法验证SSL验证。在这种情况下,我们将创建一个新会话。我只添加了这些技巧。我已经穿过这个兔子洞太深了,所以我想确保有人知道如果需要的话该怎么办。
阿里埃勒

14

您确定该网站提供服务的地址与证书相同吗?我在使用Chrome和自签名证书时遇到了同样的问题,但是最后我发现,对证书上的域名进行验证非常挑剔(应该如此)。

Chrome没有自己的证书存储区,而是使用Window自己的。但是,Chrome无法将证书导入商店,因此您应该通过IE添加证书。

在Google Chrome中安装证书

在Internet Explorer中安装证书

还请看一下这两种创建自签名证书的不同方法(我假设您正在使用IIS,而您没有提到)。

如何在IIS 7中创建自签名证书


有问题的站点是localhost,证书的CN是“ localhost”。是的,我确实将证书安装在Windows的证书存储中。IE和Chrome都抱怨该证书。
pjohansson 2011年

不知道您使用的是IIS还是Apache,但是请检查我刚刚在为IIS创建自签名证书时添加的额外链接。
艾拉·雷尼

由于对证书部分的域名验证非常挑剔:有人对此有更多了解吗?我在使用根证书的Android 9上遇到问题(2019年),谷歌浏览器将此归咎为不安全。FF和台式机都可以。
BairDev

7

我使用了bjnord建议的流程: Google Chrome,Mac OS X和自签名SSL证书

博客中显示的内容无效。

但是,博客的评论之一是金:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain site.crt

您需要关注如何获取证书文件的博客,之后您可以使用上面的命令,应该很好。


7

我无法在Linux上的Chromium上管理SSL证书的GUI正常工作。但是,他们的文档给出了正确的答案。技巧是运行下面的命令以导入自签名SSL证书。刚刚更新的名称<certificate-nickname>certificate-filename.cer,然后重新启动铬/铬。

从文档中:

在Linux上,Chromium使用NSS共享数据库。如果内置管理器对您不起作用,则可以使用NSS命令行工具配置证书。

获取工具

  • Debian / Ubuntu: sudo apt-get install libnss3-tools

  • 软呢帽: 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将设置为“ u,u,u”。

删除证书 certutil -d sql:$HOME/.pki/nssdb -D -n <certificate nickname>

摘录自: https : //chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_cert_management.md


7

Filippo Valsorda编写了一个跨平台工具,mkcert用于许多信托商店。我想他之所以写它,是因为这个问题的答案太多了:对由受信任的根CA签名的SubjectAltName证书执行“正确”的事情很痛苦。

mkcert Windows,macOS和几种Linux版本的主要程序包管理系统中都包含该程序。

证书

mkcert是制作本地信任的开发证书的简单工具。它不需要任何配置。

$ mkcert -install
Created a new local CA at "/Users/filippo/Library/Application Support/mkcert" 💥
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊

$ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
Using the local CA at "/Users/filippo/Library/Application Support/mkcert" ✨

Created a new certificate valid for the following names 📜
 - "example.com"
 - "*.example.com"
 - "example.test"
 - "localhost"
 - "127.0.0.1"
 - "::1"

The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅

6

单击URL旁边的划线标记图标时,您将看到一个类似以下的框:

在此处输入图片说明

单击证书信息链接后,您将看到以下对话框:

在此处输入图片说明

它告诉您哪个证书存储区是正确的,它是“ 受信任的根证书颁发机构”存储区。

您可以使用其他答案中概述的方法之一将证书添加到该存储中,也可以使用:

certutil -addstore -user "ROOT" cert.pem
  • ROOT 是前面提到的证书存储的内部名称。
  • cert.pem 是您的自签名证书的名称。

1
certutil -addstore -user "ROOT" cert.pem是Windows吗?
Pacerier,2015年

1
@Pacerier:正确,适用于Windows。
Der Hochstapler,2015年

您已经安装了它,Trusted Root Certification Authorities但仍然存在问题:imgur.com/a/mjlglVz imgur.com/a/n8BFH5S Windows 10,chrome 78
尝试

6

这对我有用。请参阅:http : //www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/#.Vcy8_ZNVhBc

在地址栏中,单击带有X的小锁。这将弹出一个小的信息屏幕。单击显示“证书信息”的按钮。

单击并将图像拖动到您的桌面。它看起来像一个小证书。

双击它。这将打开“钥匙串访问”实用程序。输入密码以解锁。

确保将证书添加到系统钥匙串,而不是登录钥匙串。单击“始终信任”,即使这似乎没有任何作用。

添加后,双击它。您可能必须再次进行身份验证。

展开“信任”部分。

“使用此证书时”设置为“始终信任”


6

我尝试了所有方法以及使它起作用的原因:导入时,选择正确的类别,即“ 受信任的根证书颁发机构”

(对不起,它是德国人,但请按照图片进行操作)

在此处输入图片说明


6
mkdir CA
openssl genrsa -aes256 -out CA/rootCA.key 4096
openssl req -x509 -new -nodes -key CA/rootCA.key -sha256 -days 1024 -out CA/rootCA.crt

openssl req -new -nodes -keyout example.com.key -out domain.csr -days 3650 -subj "/C=US/L=Some/O=Acme, Inc./CN=example.com"
openssl x509 -req -days 3650 -sha256 -in domain.csr -CA CA/rootCA.crt -CAkey CA/rootCA.key -CAcreateserial -out example.com.crt -extensions v3_ca -extfile <(
cat <<-EOF
[ v3_ca ]
subjectAltName = DNS:example.com
EOF
)

1
这是唯一使用chrome 77的产品。感谢您为我节省时间。
罗曼(Romain)

一个人如何使用生成的文件?我了解如何使用域.crt和.key文件,但是.csr文件有什么用?以及如何使用rootCA。*文件?请扩大您的答案...
Chiwda

非常感谢,您救了我!
dodancs

6

这篇文章已经充斥了响应,但是我根据其他一些答案创建了一个bash脚本,以使其更容易生成在Chrome中有效的自签名TLS证书(已在中测试Chrome 65.x)。希望对其他人有用。

自签名-tls bash脚本

安装(并信任)证书后,请不要忘记重启Chrome(chrome://restart


另一个值得一看的cfssl工具是CloudFlare的工具包:

cfssl


6

要在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。然后,根据以下屏幕截图,将新创建的证书拖放到“ 受信任的根证书颁发机构\证书”存储中。 在此处输入图片说明


请问如何在Mac中做到这一点?谢谢:)
Artanis Zeratul

@mpowrie。生成此文件后,如何将其链接到Apache Web服务器?在本地主机服务器上。
Ifedi Okonkwo

Ifedi Okonkwo:我不确定Apache Web服务器是否对不起,但是对于IIS,您添加类型为https的站点绑定,包括完全限定的主机名,然后选择SSL证书。
mpowrie

这就像一个魅力。我要说的是,如果您想将该证书指定为绑定对象,则还需要执行另一步骤...并且该证书也必须位于“个人”>“证书”中。出于某种原因,拖放实际上会将其从“个人”证书中删除,并将其放置在“受信任的证书”中。因此,请确保您将其复制并粘贴。
StephenPAdams

5

Mac / OSX上的SSL / HTTPS本地主机修复程序:

  1. 尝试打开https localhost环境时,单击地址栏中带有叉号的红色锁。将打开一个窗口,其中包含有关证书的一些信息。

  2. 点击“详细信息” 信息窗口

  3. chrome开发人员工具在“安全性”标签上打开。点击查看证书证书图片
  4. 将其添加到“系统”钥匙串(而不是默认情况下选择的“登录”钥匙串)。

  5. 再次打开您的钥匙串并找到证书。单击它,并确保您“信任”所有内容。

  6. 重新启动Chrome,它应该可以正常工作。


愚蠢的图形界面在MacoOS 10.14.5中可能不接受证书,但是您可以使用导入它security import filename.pem -k ~/Library/Keychains/login.keychain。图形给出了一个错误-25294
boatcoder '19

5

我遇到了同样的问题:我已将证书安装到Windows的“受信任的根权限”存储中,Chrome仍然拒绝该证书,并显示错误消息ERR_CERT_COMMON_NAME_INVALID。请注意,当证书未正确存储在商店中时,错误为ERR_CERT_AUTHORITY_INVALID

如错误名称,此注释此问题所暗示,问题出在证书中声明的域名中。在生成证书时,当提示您输入“公用名”时,我必须输入用来访问该站点的域名localhost在我的情况下)。我使用重新启动了Chrome chrome://restart,终于对这个新证书感到满意。


我也使用本地主机,但铬是不乐意了imgur.com/a/mjlglVz的Windows 10,铬78我跟着指令从这里:stackoverflow.com/a/44398368/4983983我通过访问该页面本地主机
tryingHard

使用通用名称“ localhost”几乎可以正常工作,然后当我还启动带有选项的chrome时,它确实起作用了--allow-insecure-localhost
pestophagous

5

从Chrome 58+开始,由于缺少SAN,我开始在macOS上收到证书错误。这是重新获得地址栏绿色锁定的方法。

  1. 使用以下命令生成新证书:

    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
  2. 将导入server.crt到您的KeyChain中,然后双击证书,展开Trust,然后选择Always Trust

在Google Chrome浏览器中刷新页面https://domain.dev,因此绿色锁定又回来了。


这适用于子域,api.domain.dev但我仍然在警告页面上domain.dev:有This server could not prove that it is domain.dev; its security certificate is from *.domain.dev. This may be caused by a misconfiguration or an attacker intercepting your connection.任何想法吗?
弗朗索瓦·罗曼

5

对于MacOS上的Chrome,如果您已准备好证书:

  • 退出Chrome(cmd+ Q)。
  • 启动“钥匙串访问”应用程序,然后打开“证书”类别。
  • 将您的证书文件拖到“钥匙串访问”窗口中,然后键入证书文件的密码。
  • 双击您的证书,然后展开“信任”列表。
    • 在“使用此证书时”行中,选择“始终信任”。
    • 关闭此内容并输入密码。
  • 启动Chrome并清除所有缓存。
  • 检查一切正常。

5

通过这种方法允许不安全的本地主机正常工作chrome:// flags /#allow-insecure-localhost

只是您需要将开发主机名创建为xxx.localhost。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.