1. 程式人生 > >配置https local本地開發環境

配置https local本地開發環境

const test 設置 port 配置文件 point constrain comm bubuko

今天,幾乎所有你訪問的網站都是受HTTPS保護的。如果你還沒有這樣做,是時候這樣做了。使用HTTPS保護您的服務器也就意味著您無法從非HTTPS的服務器發送請求到此服務器。這對使用本地開發環境的開發人員來說是一個問題,因為這些本地開發環境都是運行在http://localhost下的

在啟動過程中,我們決定使用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本地開發環境