今天咱們訪問的全部網站幾乎都是受HTTPS保護的。若是你的站點尚未,那你應該使用它。使用HTTPS保護服務器也意味着你不能從不是HTTPS服務器向此服務器發送請求。這給使用本地開發環境的開發人員帶來了一個問題,由於它們都運行在開箱即用的http://localhost
環境中。javascript
在我參與的項目啓動階段,咱們決定使用HTTPS來保護AWS彈性負載均衡入口,這是加強安全性的一部分。我遇到了這樣的狀況,本地開發環境對服務器的請求開始被拒絕。java
在搜索谷歌以後,我發現了幾篇相似這樣的文章,其中詳細說明了如何在localhost上實現HTTPS。即便在我虔誠地遵循這些指導以後,彷佛沒有一條是有效的。Chrome老是拋出一個NET::ERR_CERT_COMMON_NAME_INVALID
錯誤給我。node
我所找到的全部詳細說明在當時都是正確的。但如今不行了。git
通過大量的谷歌搜索,我發現本地證書被拒絕的緣由是Chrome不支持證書中的commonName匹配,實際上從2017年1月起就要求使用subjectAltName
。github
使用OpenSSL生成全部證書。shell
第一步是建立根安全套接字層(Secure Sockets Layer -SSL)證書。而後,可使用此根證書對任意數量的獨立域名的證書進行簽名。若是您不熟悉SSL生態系統,DNSimple的這篇文章很好地介紹了根SSL證書。express
生成一個RSA-2048
密鑰並將其保存到文件rootCA.key
中。此文件將用做生成根SSL證書的密鑰。每次使用此特定密鑰生成證書時,都會提示您輸入一個pass短語。安全
openssl genrsa -des3 -out rootCA.key 2048
複製代碼
你可使用生成的密鑰建立新的根SSL證書。將它保存到一個名爲rootCA.pem
的文件中。本證書有效期爲1024天。你能夠隨意把它改爲你想要的天數。還會提示您輸入其餘可選信息。bash
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
複製代碼
在使用新建立的根SSL證書開始頒發域證書以前,還有一個步驟。你須要告訴你的Mac要信任你的根證書,因此由它發出的全部證書也都是可信的。服務器
打開Mac上的密鑰鏈訪問,進入系統密鑰鏈中的證書類別。使用文件>導入項目導入rootCA.pem
。雙擊導入的證書,並在「When using this certificate:」的選項下拉框中選擇「始終信任」。
window系統經過
window+r
組合鍵調出運行運行工具後,輸入certlm.msc
,以後導入。
若是到目前爲止正確地遵循了操做指引,那麼你的證書在Keychain Access中應該是這樣的。
如今可使用根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
複製代碼
如今可使用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