google chrome - secure - 讓Chrome接受自簽本地證書




subject alternative name missing (20)

我為本地主機CN創建了一個自簽名SSL證書。 正如預期的,在最初抱怨之後,Firefox接受這個證書。 然而,Chrome和IE拒絕接受它,即使將證書添加到受信任根下的系統證書存儲區後也是如此。 即使在Chrome的HTTPS彈出窗口中單擊“查看證書信息”時,證書列為正確安裝,但仍然堅持證書不可信。

我應該怎麼做才能讓Chrome接受證書並停止抱怨?


更新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。


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控制台(File / Add or Remove Snap-ins / Certificates / Add / Computert Account / LocalComputer / OK)我在Personal store中導入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

快樂編碼!


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"


在Mac上,您可以使用鑰匙串訪問實用程序將自簽名證書添加到系統鑰匙串,然後Chrome會接受它。 我在這裡找到了一步一步的說明:

Google Chrome,Mac OS X和自簽名SSL證書

基本上:

  1. 用X雙擊鎖圖標並將證書圖標拖放到桌面上,
  2. 打開這個文件(以.cer擴展名結尾); 這將打開允許您批准證書的鑰匙串應用程序。

如果你在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
    

從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 ,綠色鎖定會恢復。


我下了使用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


這對我有效:

  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。

點擊頁面上的任意位置,然後輸入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'));




self-signed