【譯】如何在5分鐘內讓HTTPS在您的本地開發環境中工做

文章翻譯自How to get HTTPS working on your local development environment in 5 minutesjavascript

Image

今天,幾乎全部你訪問的網站都是受HTTPS保護的。若是你尚未這樣作,是時候這樣作了。使用HTTPS保護您的服務器也就意味着您沒法從非HTTPS的服務器發送請求到此服務器。這對使用本地開發環境的開發人員來講是一個問題,由於這些本地開發環境都是運行在http://localhost下的。java

在啓動過程當中,咱們決定使用HTTPS來保護咱們的AWS Elastic Load Balancer endpoints,做爲加強安全性的一部分。一開始的時候我遇到了一個問題,個人本地開發環境對服務器的請求被拒絕。node

經過快速谷歌搜索後,我發現一些文章也許對我有用,像這個這個或者這個,它們都有關於localhost如何實現HTTPS的詳細說明。但即便按照這些指示亦步亦趨,最後卻都失敗了。Chrome老是向我拋出一個NET::ERR_CERT_COMMON_NAME_INVALIDgit

Image

問題

這些文章中的全部步驟都是正確的,但那僅限於它們被髮布的時間點,而不是如今。github

通過大量的谷歌搜索以後,我發現個人本地證書被拒絕的緣由是,Chrome已經再也不支持證書中的commonName匹配,實際上,自2017年1月起須要subjectAltName這個規則了。web

解決方案

咱們將使用OpenSSL生成全部的證書。express

  • 第1步:根SSL證書

第一步是建立一個安全套接層(SSL)證書。而後能夠使用此根證書爲可能爲單個域生成的任意數量的證書籤名。若是您不熟悉SSL生態系統,那麼來自DNSimple這篇文章在介紹Root SSL證書方面作得很好。安全

生成一個RSA-2048密鑰並保存到一個文件rootCA.key。該文件將被用做生成根SSL證書的密鑰。系統將提示您輸入密碼,每次使用此特定密鑰生成證書時都須要輸入該密碼。bash

openssl genrsa -des3 -out rootCA.key 2048
複製代碼

您能夠使用您生成的密鑰來建立新的根SSL證書。並將其保存爲rootCA.pem。這個證書將有1,024天的有效期。你能夠隨意將其更改成任何您想要的天數。在這一過程當中,你還將被提示輸入其餘可選信息。服務器

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
複製代碼

Image

  • 第2步:信任根SSL證書

作完這一步,你就能夠使用你新建立的根SSL證書了。您須要告訴您的Mac相信您的根證書,所以所頒發的全部單個證書也都是可信的。

Mac上打開「鑰匙串訪問」,而後轉到「系統」中的證書列表,經過點擊+號按鈕導入證書rootCA.pem,按照提示輸入密碼, 並將「使用此證書時:」下拉列表中的「 始終信任 」選中

若是你上面全部事情都作對了的話,你的「鑰匙串訪問」看起來應該是這樣。

Image

  • 第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
複製代碼

建立證書密鑰以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
複製代碼

Image

使用您的新SSL證書 您如今已經準備好localhost使用HTTPS 來保護您的安全。將文件server.keyserver.crt文件移動到服務器上可訪問的位置,並在啓動服務器時將其包含在內。

在用Node.js編寫的Express應用程序中,如下是您要作的事情。確保你只爲你的本地環境作到這一點。不要在生產中使用它

dev-server.js hosted with ❤ by Github

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)

複製代碼

Image

我但願你發現這個教程有用。若是您不熟悉運行這裏給出的命令,我已經建立了一套能夠快速運行的便捷腳原本爲您生成證書。更多細節能夠在GitHub倉庫中找到。

我喜歡幫助其餘Web開發人員。若是您有任何建議或反饋,請在Twitter上關注我,讓我知道。

相關文章
相關標籤/搜索