今天我們訪問的所有網站幾乎都是受HTTPS保護的。如果你的站點還沒有,那你應該使用它。使用HTTPS保護服務器也意味着你不能從不是HTTPS服務器向此服務器發送請求。這給使用本地開發環境的開發人員帶來了一個問題,因為它們都運行在開箱即用的http://localhost環境中。
在我參與的項目啟動階段,我們決定使用HTTPS來保護AWS彈性負載均衡入口,這是增強安全性的一部分。我遇到了這樣的情況,本地開發環境對服務器的請求開始被拒絕。
在搜索谷歌之后,我發現了幾篇類似這樣的文章,其中詳細說明了如何在localhost上實現HTTPS。即使在我虔誠地遵循這些指導之后,似乎沒有一條是有效的。Chrome總是拋出一個NET::ERR_CERT_COMMON_NAME_INVALID錯誤給我。
問題
我所找到的所有詳細說明在當時都是正確的。但現在不行了。
經過大量的谷歌搜索,我發現本地證書被拒絕的原因是Chrome不支持證書中的commonName匹配,實際上從2017年1月起就要求使用subjectAltName。
解決方案
使用OpenSSL生成所有證書。
步驟1:根SSL證書
第一步是創建根安全套接字層(Secure Sockets Layer -SSL)證書。然后,可以使用此根證書對任意數量的獨立域名的證書進行簽名。如果您不熟悉SSL生態系統,DNSimple的這篇文章很好地介紹了根SSL證書。
生成一個RSA-2048密鑰並將其保存到文件rootCA.key中。此文件將用作生成根SSL證書的密鑰。每次使用此特定密鑰生成證書時,都會提示您輸入一個pass短語。
openssl genrsa -des3 -out rootCA.key 2048
復制代碼
你可以使用生成的密鑰創建新的根SSL證書。將它保存到一個名為rootCA.pem的文件中。本證書有效期為1024天。你可以隨意把它改成你想要的天數。還會提示您輸入其他可選信息。
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
復制代碼
步驟2:信任根SSL證書
在使用新創建的根SSL證書開始頒發域證書之前,還有一個步驟。你需要告訴你的Mac要信任你的根證書,所以由它發出的所有證書也都是可信的。
打開Mac上的密鑰鏈訪問,進入系統密鑰鏈中的證書類別。使用文件>導入項目導入rootCA.pem。雙擊導入的證書,並在“When using this certificate:”的選項下拉框中選擇“始終信任”。
window系統通過
window+r組合鍵調出運行運行工具后,輸入certlm.msc,之后導入。
如果到目前為止正確地遵循了操作指引,那么你的證書在Keychain Access中應該是這樣的。
步驟3:域SSL證書
現在可以使用根SSL證書專門為位於localhost的本地開發環境頒發證書。
創建一個新的OpenSSL配置文件server.csr.cnf,以便在創建證書時導入這些設置,而不是在命令行中輸入它們。
[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn [dn] C=US ST=RandomState L=RandomCity O=RandomOrganization OU=RandomOrganizationUnit emailAddress=hello@example.com CN = localhost 復制代碼
創建一個v3.ext文件以創建一個X509 v3證書。注意這里是如何指定subjectAltName的。
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = 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的證書文件。
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
復制代碼
使用新的SSL證書
現在可以使用HTTPS保護本地主機了。移動server.key和server.crt文件到服務器上可訪問的位置,並在啟動服務器時包含它們。
在一個用Node.js編寫的Express應用程序可以這樣做。確保只在本地開發環境使用,不要在生產中使用這個。
var path = require('path') var fs = require('fs') var express = require('express') var https = require('https') var certOptions = { key: fs.readFileSync(path.resolve('build/cert/server.key')), cert: fs.readFileSync(path.resolve('build/cert/server.crt')) } var app = express() var server = https.createServer(certOptions, app).listen(443) 復制代碼
希望本教程對你有用。如果你不習慣自己運行命令,我創建了一組方便的shell腳本,你可以快速運行這些腳本來生成證書。更多細節可以在GitHub repo上找到。
原文:How to get HTTPS working on your local development environment in 5 minutes
作者:Make_a_decision
鏈接:https://juejin.im/post/5cff091ee51d455cd73ba068
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
