
今天咱们访问的全部网站几乎都是受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
步骤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.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