让加密SSL无法启动“错误:EACCES:权限被拒绝,打开'/etc/letsencrypt/live/domain.net/privkey.pem'”

问题描述 投票:3回答:2

我尝试使用Node.js的SSL,但它不起作用,因为permission denied

try {
var TLSoptions = {
    key: fs.readFileSync("/etc/letsencrypt/live/domain.work/privkey.pem"),
    cert: fs.readFileSync("/etc/letsencrypt/live/domain.work/cert.pem")
};

https.createServer(TLSoptions, app).listen(port, host, function() {
   console.log("TLS Website started.")
}); catch(e) {
    console.log(e)
}

=>

{ Error: EACCES: permission denied, open '/etc/letsencrypt/live/domain.work/privkey.pem'
at Object.fs.openSync (fs.js:663:18)
... (Librarys dump)
errno: -13,
code: 'EACCES',
syscall: 'open',
path: '/etc/letsencrypt/live/domain.work/privkey.pem' }

所以我尝试重新制作* .pem的文件。

rm -f /etc/letsencrypt/live
rm -f /etc/letsencrypt/archive    
rm -f /etc/letsencrypt/renewal
sudo ./letsencrypt-auto certonly -a standalone -d domain.work

并检查文件权限。

/etc/letsencrypt/live/domain.work$ ls -lsa
total 12
4 drwxr-xr-x 2 root root 4096 Jan  3 21:56 .
4 drwx------ 3 root root 4096 Jan  3 21:56 ..
0 lrwxrwxrwx 1 root root   37 Jan  3 21:56 cert.pem -> 
../../archive/domain.work/cert1.pem
0 lrwxrwxrwx 1 root root   38 Jan  3 21:56 chain.pem -> 
../../archive/domain.work/chain1.pem
0 lrwxrwxrwx 1 root root   42 Jan  3 21:56 fullchain.pem -> 
../../archive/domain.work/fullchain1.pem
0 lrwxrwxrwx 1 root root   40 Jan  3 21:56 privkey.pem -> 
../../archive/domain.work/privkey1.pem

/etc/letsencrypt/archive/domain.work$ ls -lsa
total 24
4 drwxr-xr-x 2 root root 4096 Jan  3 21:56 .
4 drwx------ 3 root root 4096 Jan  3 21:56 ..
4 -rw-r--r-- 1 root root 1789 Jan  3 21:56 cert1.pem
4 -rw-r--r-- 1 root root 1647 Jan  3 21:56 chain1.pem
4 -rw-r--r-- 1 root root 3436 Jan  3 21:56 fullchain1.pem
4 -rw-r--r-- 1 root root 1708 Jan  3 21:56 privkey1.pem

但它没有解决,我找不到任何错误和问题。 如何解决这个问题?

node.js ssl lets-encrypt
2个回答
8
投票

当您使用sudo颁发证书时,它们将由root拥有。由于节点未以root身份运行,并且证书文件夹上的权限不允许除所有者之外的任何人打开它们,因此您的节点应用程序无法看到它们。

为了理解解决方案,让我们假设节点以用户nodeuser运行

解决方案#1(临时): 您可以将证书的所有者切换到节点用户。 $ sudo chown nodeuser -R /etc/letsencrypt 但是,这可能会破坏任何其他查看证书的项目,例如Nginx或Apache。 它也将持续到您的下一次更新,不超过90天。另一方面,无论您更新证书的脚本还可以设置所有者。

解决方案#2(不要这样做): 以root身份运行节点。 sudo node index.js 这将以root用户身份运行节点,这意味着节点的非常不安全的表面可以访问系统上的所有内容。请不要这样做。

解决方案#3(也不要这样做): 向所有人打开证书。 证书存储在/etc/letsencrypt/archive/${domain}/cert1.pem中,并与/etc/letsencrypt/live/${domain}/cert1.pem相关联。

这两个路径中的所有文件夹都是+ x,这意味着系统上的所有用户都可以打开文件夹,但“live”和文件夹“本身除外”。 您也可以通过更改权限来打开它们。

$ sudo chmod +x /etc/letsencrypt/live
$ sudo chmod +x /etc/letsencrypt/archive

这很糟糕,因为它允许从其他意外来源访问。通常打开文件夹给每个人是一个坏主意。

解决方案#4(做到这一点): 另一方面,您可以创建一个受限制的组,并允许仅为它们打开权限。

// Create group with root and nodeuser as members
$ sudo addgroup nodecert
$ sudo adduser nodeuser nodecert
$ sudo adduser root nodecert

// Make the relevant letsencrypt folders owned by said group.
$ sudo chgrp nodecert /etc/letsencrypt/live
$ sudo chgrp nodecert /etc/letsencrypt/archive

// Allow group to open relevant folders
$ sudo chmod 710 /etc/letsencrypt/live
$ sudo chmod 710 /etc/letsencrypt/archive

这应该允许节点访问带有证书的文件夹,而不是打开给其他任何人。

然后,您应该重新启动或至少在这些更改之后注销。 (对权限和组的许多更改都需要新会话,并且在重新启动之前我们遇到了PM2问题。)


0
投票

你解决了问题了吗?

我遇到了与您上面描述的相同的问题,这里是我为解决它而做的。我认为您需要将文件夹的权限从/ etc一直更改为.pem文件到755,因为它需要读取文件夹以访问其中的文件的权限。您还必须授予.pem文件的读取和执行权限,以便Nodejs可以验证它。

© www.soinside.com 2019 - 2024. All rights reserved.