Ssl

使用可在 Chrome 58 中使用的 openssl 生成自簽名證書

  • February 4, 2021

從 Chrome 58 開始,它不再接受依賴於Common Namehttps ://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place= topicsearchin/chrome/category $3ACanary%7Csort 的自簽名證書:相關性%7Cspell:false

相反,它需要使用Subject Alt Name. 我以前一直在關注如何生成自簽名證書的指南:https ://devcenter.heroku.com/articles/ssl-certificate-self效果很好,因為我需要server.crtserver.key文件來完成我正在做的事情。我現在需要生成新的證書,其中包括SAN但我所有的嘗試都不適用於 Chrome 58。

這是我所做的:

我按照上面提到的 Heroku 文章中的步驟生成密鑰。然後我寫了一個新的 OpenSSL 配置文件:

[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = san
extensions          = san
[ req_distinguished_name ]
countryName         = US
stateOrProvinceName = Massachusetts
localityName        = Boston
organizationName    = MyCompany
[ san ]
subjectAltName      = DNS:dev.mycompany.com

然後server.crt使用以下命令生成:

openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650

我在 Mac 上,所以我server.crt用鑰匙串打開了文件,將它添加到我的系統證書中。然後我將其設置為Always Trust.

除了設置 SAN 值的配置文件之外,這些步驟與我在以前版本的 Chrome 中用於生成和信任自簽名證書的步驟類似。

但是,在此之後,我仍然可以使用ERR_CERT_COMMON_NAME_INVALIDChrome 58。

我的解決方案:

openssl req \
   -newkey rsa:2048 \
   -x509 \
   -nodes \
   -keyout server.key \
   -new \
   -out server.crt \
   -subj /CN=dev.mycompany.com \
   -reqexts SAN \
   -extensions SAN \
   -config <(cat /System/Library/OpenSSL/openssl.cnf \
       <(printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')) \
   -sha256 \
   -days 3650

狀態:為我工作

這是一個適合我的解決方案:

創建 CA 密鑰和證書

# openssl genrsa -out server_rootCA.key 2048
# openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 3650 -out server_rootCA.pem

創建 server_rootCA.csr.cnf

# server_rootCA.csr.cnf
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=DE
ST=Berlin
L=NeuKoelln
O=Weisestrasse
OU=local_RootCA
emailAddress=ikke@server.berlin
CN = server.berlin

創建 v3.ext 配置文件

# v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.berlin

創建伺服器密鑰

# openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server_rootCA.csr.cnf )

創建伺服器證書

# openssl x509 -req -in server.csr -CA server_rootCA.pem -CAkey server_rootCA.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile v3.ext

將證書和密鑰添加到 Apache2 站點文件、HTTPS(埠 443)部分

SSLCertificateFile    /etc/apache2/ssl/server.crt
SSLCertificateKeyFile    /etc/apache2/ssl/server.key

將 server_rootCA.pem 從伺服器複製到您的電腦。

# scp you@server.berlin:~/server_rootCA.pem .

.. 並將其添加到 Chromium 瀏覽器

Chromium -> Setting -> (Advanced) Manage Certificates -> Import -> 'server_rootCA.pem'

你已經完成了!

PS您可以簡單地在 HTTP 伺服器配置中禁用 HSTS 標頭,而不是創建功能 CA 和伺服器證書對(按照上面的說明)。這將阻止 Chromium 強制執行 HTTPS,並允許使用者點擊“高級 → 繼續訪問 your.url(不安全)”,而無需獲取並安裝您的自定義 CA (server_rootCA.pem) 證書。換句話說 - 必須禁用 HSTS 將允許通過 HTTP 和/或不安全的 HTTPS 連接公開查看您的網站(當心!)。

對於 Apache2,將以下內容添加到站點文件 HTTP(埠 80)部分

Header unset Strict-Transport-Security
Header always set Strict-Transport-Security "max-age=0;includeSubDomains"

在 Debian/Apache2.4 + Debian/Chromium 59 上測試

https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

引用自:https://serverfault.com/questions/845766