怎样正确的将 acme.sh 生成的 Let's Encrypt 证书部署到 Node.js 服务里?
发布于 3 年前 作者 lmk123 3658 次浏览 来自 问答

我用 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'),
});
回到顶部