有时在测试环境下要使用 https 服务,但是又没有正式的证书,这时我们可以自己签名一个临时证书用来提供 https 服务,然后通过修改浏览器的设置,允许使用该未授信证书,从而访问本地的 https 网站。
本文使用 Express 框架做演示
生成证书
首先检查是否安装了 openssl ,如果没安装需要先自行安装。
openssl version
//=> LibreSSL 2.8.3
然后进入 express 项目的根目录,新建目录,并使用 openssl 生成证书
mkdir ssl
openssl req -nodes -new -x509 -keyout ./ssl/localhost.key -out ./ssl/localhost.cert
生成过程会询问几个参数,注意 Common Name 要填写,这里我用的本机IP。
生成完成后查看 ssl 目录,会发现生成了2个新文件。
express 服务代码
express 参考文档:https://www.expressjs.com.cn/4x/api.html#app.listen
页面访问
访问 http://localhost/ping ,正常返回
访问 https://localhost/ping ,页面无法加载
因为我用的是 Chrome 浏览器,对于自己签名的,未授信证书,拒绝加载。需要修改 Chrome 设置,打开浏览器设置地址 chrome://flags/#allow-insecure-localhost
更改为 Enabled ,然后需要重启浏览器
现在可以访问 https://localhost/ping 了。
如果依然无法访问并提示: NET::ERR_CERT_REVOKED,则尝试,先在Chrome浏览器的错误页面任意位置点击一下(不能是地址栏里),然后盲打输入 thisisunsafe
(参考:https://aboutssl.org/how-to-fix-net-err-cert-revoked-error/)。
注意事项
使用 openssl 生成证书时,如果不填 Common Name 参数,则只会生成一个 localhost.key 文件,无法正常启动服务。
使用 openssl 生成证书时,key 文件和 cert 文件需要最好同时生成,否则会导致 key 和 cert 不匹配。