5分鐘上手:本地開發環境啓動HTTPS

How to get HTTPS working on your local development environment in 5 minutes

今天咱們訪問的全部網站幾乎都是受HTTPS保護的。若是你的站點尚未,那你應該使用它。使用HTTPS保護服務器也意味着你不能從不是HTTPS服務器向此服務器發送請求。這給使用本地開發環境的開發人員帶來了一個問題,由於它們都運行在開箱即用的http://localhost環境中。javascript

在我參與的項目啓動階段,咱們決定使用HTTPS來保護AWS彈性負載均衡入口,這是加強安全性的一部分。我遇到了這樣的狀況,本地開發環境對服務器的請求開始被拒絕。java

在搜索谷歌以後,我發現了幾篇相似這樣的文章,其中詳細說明了如何在localhost上實現HTTPS。即便在我虔誠地遵循這些指導以後,彷佛沒有一條是有效的。Chrome老是拋出一個NET::ERR_CERT_COMMON_NAME_INVALID錯誤給我。node

問題

我所找到的全部詳細說明在當時都是正確的。但如今不行了。git

通過大量的谷歌搜索,我發現本地證書被拒絕的緣由是Chrome不支持證書中的commonName匹配,實際上從2017年1月起就要求使用subjectAltNamegithub

解決方案

使用OpenSSL生成全部證書。shell

步驟1:根SSL證書

第一步是建立根安全套接字層(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
複製代碼

步驟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.keyserver.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

相關文章
相關標籤/搜索