google chrome - 证书导入 - 让Chrome接受自签本地证书




不接受您的登录证书 (20)

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

更新02/2016:Mac用户更好的说明可以在Here找到。

  1. 在要添加的站点上,右键单击地址栏中的红色锁图标:

    1. 单击标记为Connection的选项卡,然后单击证书信息

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

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

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

    5. 打开Chrome设置,滚动至底部,然后点击显示高级设置...

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

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

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

    9. 选择将所有证书放入以下商店 。 所选商店应该是受信任的根证书颁发机构 。 如果不是,请单击浏览...并选择它。 点击下一步完成

    10. 在安全警告上单击

    11. 重新启动Chrome。

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

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


What am I supposed to do to get Chrome to accept the certificate and stop complaining about it?

You should create a PKI with;

1) self-signed Root CA.
2) sub / intermediate certificate [signed by Root CA].
3) normal / end-entity certificate [signed either by Root CA or sub-CA] (commonName or subjectAltName (SAN) as localhost) (also include localhost as the URI in SAN).
4) Import / Install that Root CA in your Windows OS (because you mentioned IE. Google Chrome is using the same resources while looking for certificates chain - https://www.chromium.org/Home/chromium-security/root-ca-policy ) as 'Trusted Root Certification Authorities'.
5) Install that end-entity certificate as your web server certificate, and it stops complaining that error message.

希望这可以帮助。


2017-06-27 newest method:

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

then, add yoursite.crt and yoursite.key to your nginx conf.

from: https://github.com/webpack/webpack-dev-server/issues/854


CHROME 58+更新(RELEASED 2017-04-19)

从Chrome 58开始,仅使用commonName标识主机正在被删除 。 请参阅此处的进一步讨论错误跟踪器 。 过去, subjectAltName仅用于多主机证书,因此一些内部CA工具可能不包含它们。

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

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

对于openssl,这意味着您的配置对于单个主机将具有类似于以下内容的内容:

[v3_req]
subjectAltName = DNS:example.com

或多个主机:

[v3_req]
subjectAltName = DNS:example.com, DNS:host1.example.com, DNS:*.host2.example.com, IP:10.1.2.3

在Chrome的证书查看器(已转到F12下的“安全”选项卡)中,您应该看到它在“ Extensions名为Certificate Subject Alternative Name

临时替代方法

使用以下设置可以回退到旧的commonName行为, 直到Chrome 65EnableCommonNameFallbackForLocalAnchors

在Windows上 ,这可以使用以下注册表命令在一台PC上设置(谢谢@Meengla):

reg add HKLM\Software\Policies\Google\Chrome /v EnableCommonNameFallbackForLocalAnchors /t REG_DWORD /d 1

在Mac上 ,可以使用以下命令(谢谢@BugsBunny):

defaults write com.google.Chrome EnableCommonNameFallbackForLocalAnchors -bool true

在Linux上 ,使用以下内容创建策略文件,例如/etc/opt/chrome/policies/managed/EnableCommonNameFallbackFor‌​LocalAnchors.json{ "EnableCommonNameFallbackForLocalAnchors": true } (谢谢@seanf)

有关为各种平台设置这些策略的更多详细信息(包括通过Windows GPO进行设置)可以在链接页面的顶部以及Chromium策略模板指南管理员指南中找到

再次,这些解决方法是暂时的,直到版本65!


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 =证书Thumprint

appid = GUID(您的选择)

首先,我尝试以不同的方式在受信任的根证书颁发机构上导入证书“device.crt”,但我仍然收到相同的错误:

但我意识到我应该为域导入根权限证书而不是证书。 所以我使用mmc控制台(文件/添加或删除管理单元/证书/添加/计算器帐户/本地计算机/确定)我在受信任的根证书颁发机构存储中导入了rootCA.pem。

重新启动Chrome等等。

用localhost:

或使用IP地址:

我唯一无法实现的就是它已经过时了密码(图片上的红色方块)。 帮助表示赞赏。

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


不适合生产

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

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

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

点击Enable


更新于 4月3/2018

由Chromium团队推荐

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

快速超级简易解决方案

有一个秘密的绕过短语,可以输入到错误页面,让Chrome继续执行,尽管存在安全错误:这是不安全的 (在早期版本的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.jswindow.atob函数可以在JS控制台中执行。

有关Chrome团队为何改变旁路短语的背景(第一次):

https://bugs.chromium.org/p/chromium/issues/detail?id=581189

如果一切都失败了

如果“继续继续”选项不可用,或者旁路短语正在工作,那么对于快速的一次性操作,此黑客行之有效:

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

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

    (和@Chris的投票答案https://.com/a/31900210/430128 )

  2. 如果你想连接的网站是localhost ,你就完成了。 否则,建立一个TCP隧道在本地侦听端口8090,并在端口443连接到broken-remote-site.com ,确保你已安装了socat并在终端窗口中运行如下所示:

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

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


For Chrome on MacOS, if you have prepared a certificate:

  • Quit Chrome ( cmd + Q ).
  • Start the Keychain Access app and open the "Certificates" category.
  • Drag your certificate file onto the Keychain Access window and type the password for the certificate file.
  • Double click on your certificate and unfold the "Trust" list.
    • In row "When using this certificate," choose "Always Trust."
    • Close this stuff and type your password.
  • Start Chrome and clear all caches.
  • Check that everything is ok.

I fixed this problem for myself without changing the settings on any browsers with proper SSL certifications. I use a mac so it required a keychain update to my ssl certifications. I had to add subject alt names to the ssl certification for chrome to accept it. As of today, this is for Chrome version number: 62.0.3202.94

My example are easy to use commands and config files:

add these files and this example is all in one root directory

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

Run command to create certification:

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'

For macs only to add trusted certification (required):

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

For windows you will have to find how to verify our ssl certs locally independently. I don't use Windows. Sorry windows guys and gals.

I am using a node.js server with express.js with only requires my key and certification with something like this:

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);

I may be doing this for other backend frames in the future, so I can update example this for others in the future. But this was my fix in Node.js for that issue. Clear browser cache and run your app on https://

Here's an example of running localhost on a Node.js server for Mac users:

https://github.com/laynefaler/Stack-Overflow-running-HTTPS-localhost

Happy Coding!


I had to tweak the Chrome launcher on macosx and added below script. Saved it as below;

/Applications/Google\ Chrome.app/Contents/MacOS/Chrome.command

#!/bin/sh
RealBin="Google Chrome"
AppDir="$(dirname "$0")"
exec "$AppDir/$RealBin" --ignore-certificate-errors "[email protected]"

When I start Chrome with this script self-signed certificates are working without a problem. But don't browse the web with the browser launched with this script you will not be warned about invalid certificates!


I was experiencing the same issue: I had installed the certificate in to Windows' Trusted Root Authorities store, and Chrome still refused the certificate, with the error ERR_CERT_COMMON_NAME_INVALID . Note that when the certificate is not properly installed in the store, the error is ERR_CERT_AUTHORITY_INVALID .

As hinted by the name of the error, this comment , and this question , the problem was lying in the declared domain name in the certificate. When prompted for the "Common Name" while generating the certificate, I had to enter the domain name I was using to access the site ( localhost in my case). I restarted Chrome using chrome://restart and it was finally happy with this new certificate.


It didn't work for me when I tried to import the certificate in the browser... In chrome open Developer Tools > Security, and select View certificate. Click the Details tab and export it.

// LINUX

sudo apt-get install libnss3-tools 

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

Run this command and if you see the file You've just imported You are good to go!

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

// Windows

Start => run => certmgr.msc

On the left side select Trusted Root Certification Authorities => Personal. Click on actions tab => All actions/import then choose the file You exported before from the browser

Don't forget to restart chrome!!!

GOOD LUCK! ;)


This worked for me. See: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/#.Vcy8_ZNVhBc

In the address bar, click the little lock with the X. This will bring up a small information screen. Click the button that says "Certificate Information."

Click and drag the image to your desktop. It looks like a little certificate.

Double-click it. This will bring up the Keychain Access utility. Enter your password to unlock it.

Be sure you add the certificate to the System keychain, not the login keychain. Click "Always Trust," even though this doesn't seem to do anything.

After it has been added, double-click it. You may have to authenticate again.

Expand the "Trust" section.

"When using this certificate," set to "Always Trust"


从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 ,绿色锁定会恢复。


在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权限完全信任的新自签名证书,可以使用这些脚本来完成。

create_root_cert_and_key.sh

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

if [ -z "$1" ]
then
  echo "Please supply a subdomain to create a certificate for";
  echo "e.g. www.mysite.com"
  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"

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网站上关于此一般流程的更详细说明:

  1. 打开钥匙串访问
  2. 在“钥匙串”列表中选择“系统”
  3. 在“类别”列表中选择“证书”
  4. 选择“文件|导入项目...”
  5. 浏览到上面创建的文件“rootCA.pem”,选择它,然后单击“打开”
  6. 在“证书”列表中选择新导入的证书。
  7. 点击“我”按钮,或右键单击您的证书,然后选择“获取信息”
  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

如果你在Mac上并没有看到导出选项卡或如何获取证书,这对我来说很合适:

  1. 在https://之前点击锁定
  2. 转到“连接”选项卡
  3. 点击“证书信息”

    现在你应该看到这个:

  4. 拖动那个小小的证书图标做你的桌面(或任何地方)。

  5. 双击已下载的.cer文件,这应该将其导入您的钥匙串并打开钥匙串访问您的证书列表。

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

    除此以外:

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

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

从Wolph编辑

为了使这一点更容易,你可以使用下面的脚本( source ):

  1. 将以下script保存为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
    

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

博客中显示的内容无效。

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

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

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


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

chrome://restart


点击页面上的任意位置,然后输入BYPASS_SEQUENCE

thisisunsafe ”是Chrome版本65的BYPASS_SEQUENCE

badidea ”Chrome版本62 - 64。

在早期版本的Chrome中使用“ danger

您不需要查找输入字段,只需键入它。 这感觉很奇怪,但它工作。

我在Mac High Sierra上试了一下。

仔细检查他们是否再次改变它去最新的铬源代码

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

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

现在他们伪装了它,但要看到真正的BYPASS_SEQUENCE,您可以在浏览器控制台中执行以下行。

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

这对我有效:

  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。




self-signed