文章翻译自How to get HTTPS working on your local development environment in 5 minutesjavascript
今天,几乎全部你访问的网站都是受HTTPS
保护的。若是你尚未这样作,是时候这样作了。使用HTTPS
保护您的服务器也就意味着您没法从非HTTPS
的服务器发送请求到此服务器。这对使用本地开发环境的开发人员来讲是一个问题,由于这些本地开发环境都是运行在http://localhost
下的。java
在启动过程当中,咱们决定使用HTTPS
来保护咱们的AWS Elastic Load Balancer endpoints
,做为加强安全性的一部分。一开始的时候我遇到了一个问题,个人本地开发环境对服务器的请求被拒绝。node
经过快速谷歌搜索后,我发现一些文章也许对我有用,像这个,这个或者这个,它们都有关于localhost
如何实现HTTPS
的详细说明。但即便按照这些指示亦步亦趋,最后却都失败了。Chrome
老是向我抛出一个NET::ERR_CERT_COMMON_NAME_INVALID
。git
这些文章中的全部步骤都是正确的,但那仅限于它们被发布的时间点,而不是如今。github
通过大量的谷歌搜索以后,我发现个人本地证书被拒绝的缘由是,Chrome
已经再也不支持证书中的commonName
匹配,实际上,自2017年1月起须要subjectAltName
这个规则了。web
咱们将使用OpenSSL
生成全部的证书。express
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
复制代码
SSL
证书作完这一步,你就能够使用你新建立的根SSL
证书了。您须要告诉您的Mac
相信您的根证书,所以所颁发的全部单个证书也都是可信的。
在Mac
上打开“钥匙串访问”,而后转到“系统”中的证书列表,经过点击+
号按钮导入证书rootCA.pem
,按照提示输入密码, 并将“使用此证书时:”下拉列表中的“ 始终信任 ”选中
若是你上面全部事情都作对了的话,你的“钥匙串访问”看起来应该是这样。
根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
复制代码
使用您的新SSL
证书 您如今已经准备好localhost
使用HTTPS
来保护您的安全。将文件server.key
和server.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)
复制代码
我但愿你发现这个教程有用。若是您不熟悉运行这里给出的命令,我已经建立了一套能够快速运行的便捷脚原本为您生成证书。更多细节能够在GitHub仓库中找到。
我喜欢帮助其余Web开发人员。若是您有任何建议或反馈,请在Twitter上关注我,让我知道。