【发布时间】:2020-10-18 09:46:44
【问题描述】:
我正在 node.js 上开发一个安全的 Web 服务器,我正在使用带有 https 模块的 Let's Encrypt 证书。
我希望它在 Ubuntu/Debian 机器上运行。
默认情况下,证书和私钥存储在:
/etc/letsencrypt/live/domain.name.example/fullchain.pem
/etc/letsencrypt/live/domain.name.example/privkey.pem
这些文件权限只允许root用户读取,所以问题是node.js服务器无法正常加载使用:
const cert = fs.readFileSync("/etc/letsencrypt/live/domain.name.example/fullchain.pem");
const privKey = fs.readFileSync("/etc/letsencrypt/live/domain.name.example/privkey.pem");
(会抛出权限错误)
我知道的唯一解决方案是:
- 以 root 身份运行节点服务器,因此它具有文件权限(不推荐用于节点)。
- 将带有
sudo cp的文件复制到本地目录并使用sudo chmod +r应用权限,以便在每次证书更新后服务器可以访问它们(let's encrypt 不建议复制这些文件,但这是我目前的解决方案)。 - 以root身份运行节点,加载证书和私钥,然后将uid更改为具有
process.setgid()和process.setuid()的非root用户,这将放弃root权限。
我的问题是是否有更好的解决方案来实现这一点,或者其中一种方法就可以了?
【问题讨论】:
-
致任何对此投反对票的人:您能解释一下如何改进我的问题吗?我已经说明了问题所在并提供了我自己的解决方案。
-
观察:人们出于各种愚蠢的原因投反对票。为什么要问为什么?问题:您的节点 https 模块是否使用端口 443?问题:您是否决定不使用 nginx(或 apache)作为网络和 nodejs 应用程序之间的反向代理和 TLS 终止?如果您专注于安全性,这可能是一个不错的选择,并且 certbot 在该设置中没有任何文件权限问题。
-
@O.Jones 我不使用端口 433。而 nginx 作为反向代理可能是一个很好的解决方案。我会试试看它是否有效。
-
我在 apache 后面使用节点,使用 apache 作为反向代理,没有 prlbem。 @ojones TLS 终止是什么意思?在反向代理之后,我从 https 转到 http,然后从 wss 转到 ws。你能详细说明一下吗?谢谢!
标签: node.js linux ssl root lets-encrypt