配置https local本地開發環境
在啟動過程中,我們決定使用HTTPS來保護我們的AWS Elastic Load Balancer endpoints,作為增強安全性的一部分。一開始的時候我遇到了一個問題,我的本地開發環境對服務器的請求被拒絕。
通過快速谷歌搜索後,我發現一些文章也許對我有用,像這個,這個或者這個,它們都有關於localhost如何實現HTTPS的詳細說明。但即使按照這些指示亦步亦趨,最後卻都失敗了。Chrome總是向我拋出一個NET::ERR_CERT_COMMON_NAME_INVALID。
問題
這些文章中的所有步驟都是正確的,但那僅限於它們被發布的時間點,而不是現在。
經過大量的谷歌搜索之後,我發現我的本地證書被拒絕的原因是,Chrome已經不再支持證書中的commonName匹配,實際上,自2017年1月起需要subjectAltName這個規則了。
解決方案
第一步:創建根證書
如果對根證書的概念不了解可以參考以下文章
https introduction 和 What is a Root SSL Certificate?
生成一個RSA-2048密鑰並保存到一個文件rootCA.key。該文件將被用作生成根SSL證書的密鑰。系統將提示您輸入密碼,每次使用此特定密鑰生成證書時都需要輸入該密碼
$ openssl genrsa -des3 -out rootCA.key 2048
您可以使用您生成的密鑰來創建新的根SSL證書。並將其保存為rootCA.pem。這個證書將有3,650天的有效期。你可以隨意將其更改為任何您想要的天數。在這一過程中,你還將被提示輸入其他可選信息。
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem
第2步:如何把根SSL證書導入到Windows根證書存儲區
打開控制面板 -》 系統與安全
輸入關鍵字cer搜索,選擇管理用戶證書或者管理計算機證書
打開受信任的根證書
從菜單導入
查看導入結果
第3步:創建域SSL證書
根SSL證書現在可以用來為您的本地localhost開發環境專門發行證書。
創建一個新的OpenSSL配置文件,server.csr.cnf以便在創建證書時可以導入這些設置,而不必在命令行上輸入它們。
修改 DNS.1為自己的域名
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = localhost
創建證書密鑰以localhost使用存儲在其中的配置設置server.csr.cnf。該密鑰存儲在server.key。
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <(cat server.csr.cnf)
證書簽名請求通過我們之前創建的根SSL證書頒發,創建出一個localhost的域名證書。輸出是一個名為的證書文件server.crt。
創建keystore和密鑰對
此時系統會要求設置keystore密碼,設置密碼,例如changeit, 並記住它後面配置gretty會用到此密碼
keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048 -ext san=dns:your_domain
導入根證書或中級證書到keystore
keytool -import -trustcacerts -alias root -file server.crt -keystore keystore.jks
列出keystore存在的所有證書
keytool -list -v -keystore keystore.jks
配置gretty屬性
gretty { integrationTestTask = ‘test‘ debugPort = 5005 debugSuspend = true httpsPort = 8080 httpsEnabled = true httpEnabled = false sslKeyStorePath = ‘ssl/keystore.jks‘
sslKeyStorePassword = ‘changeit‘
sslKeyManagerPassword = ‘changeit‘
}
cd project_home
gradle appRun
重啟Chrome(很重要)
打開網站
看到瀏覽器上的小鎖,即成功
參考文獻
https://deliciousbrains.com/https-locally-without-browser-privacy-errors/
https://www.cnblogs.com/chyingp/p/https-introduction.html
推薦以下文章
https://superuser.com/questions/1083766/how-do-i-deal-with-neterr-cert-authority-invalid-in-chrome
https://www.chinassl.net/ssltools/keytool-commands.html
https://juejin.im/post/5a6db896518825732d7fd8e0
配置https local本地開發環境