怎样正确的将 acme.sh 生成的 Let's Encrypt 证书部署到 Node.js 服务里?
我用 acme.sh 生成了 Let’s Encrypt 证书,acme.sh 提供了四个文件:
- example.com.key
- example.com.cer
- fullchain.cer
- ca.cer
一开始我的代码是这么写的:
https.createServer({
key: readFileSync('example.com.key'),
cert: readFileSync('example.com.cer'),
})
最近总有人反馈说浏览器提示证书不正确,但是我这边一切正常。于是我找了个在线的 SSL 检测工具,检测结果说证书链不完整,可能会导致第一次访问网站时被浏览器提示证书不正确。经过了一段时间的搜索,我把上面代码中的 cert: example.com.cer
改成了 cert: fullchain.cer
,再检测时结果直接提示证书不可信,但我在 ssllabs.com 里检测结果是 A。
经过反复测试,无论使用哪个,在我这里都是正常的(测试前都有清除操作系统的 SSL 缓存)。所以我有一些疑问:
- cert 应该用 example.com.cer 还是 fullchain.cer,为什么?我目前知道 fullchain.cer = example.com.cer + ca.cer,也就是说用了 fullchain.cer,证书链就完整了吗?
- ca 需要指定吗?我尝试加过
ca: ca.cer
,在我这里测试也是正常的,那是加上比较好还是不加比较好?如果加上的话是要指定为 ca.cer 文件吗? - 我发现虽然在浏览器里测试正常,但是在 Ubuntu 16.04 里用 curl 访问的时候会报 curl: (60) server certificate verification failed. 的错误,用 cnodejs.org 测试了也有这个错误,那么这个错误可以安全的忽略吗?
疑问太多了,归根结底还是对 SSL 证书不太了解,网上查了一些资料虽然有 fullchain、cert 等关键字,但同时大部分资料介绍的似乎都是 pem 格式,所以我不确定跟 acme.sh 里的这四个文件是否对应的上。希望能有大神答疑解惑
1 回复
cert 要用 fullchain.cer :
https.createServer({
key: readFileSync('example.com.key'),
cert: readFileSync('fullchain.cer'),
});