为了方便做一些模拟验证,我们有时候需要在本地起 https 环境,比如调试验证一些协议是 https 的内嵌页面。
实现自签名证书
最先想到的方法当然是自签名证书,自己签发证书和密钥之后,启动一个 https 服务即可。这块网上资料比较杂乱,下面记录一下过程。
安装 openssl
首先本地要安装一下 openssl,用来生成证书。mac 上的话 homebrew 安装即可,我本地安装过了,查看一下版本:
先用 openssl 生成私钥
可以看到 server.key
已经有了:
再用私钥生成证书申请文件
req 的时候需要根据命令行提示输入必要信息,前几个可以一路回车,直到 Common Name
这里需要输入 localhost
,也可以天 *.domain.com
申请通配符域名证书。最后的 password
也可以放空。
执行完之后可以看到申请文件 server.csr
已经生成:
用私钥对申请文件签名从而生成证书
这里可以通过-days
设置有效期,比如我这里生成了一个十年有效的 server.crt
:
nodejs 起 https 服务
由于要响应静态资源,并且起 https 服务的时候我不想再写端口,所以比起 https.createServer
我们还要再多写点代码。
方便起见,我就用 koa 了,先起一个大家经常写的 http 服务:
再把他改造成 https 服务:
相比之前这里稍作了改动。先照常启动一个 http 服务,把之前生成的签名证书和密钥读取之后,在启动一个相同的 https server 监听 443端口。这样就可以通过 https://localhost
,不用加端口直接访问服务了。
浏览器查看
直接用 chrome 访问试试,大概率会显示 SSL error: ERR_CERT_INVALID
,老版本 chrome 可以选择跳过,新版 chrome 对这方面限制的并且无法跳过。
- 解法一是去
chrome://flags/#allow-insecure-localhost
开启允许无效证书选项。 - 解法二是在当前提示错误的页面,输入
thisisunsafe
告诉 chrome 你知道的,不用管。
我比较喜欢解法二。