让我们以“错误:EACCES:权限被拒绝,打开'/etc/letsencrypt/live/domain.net/privkey.pem'”开头的SSL进行加密

kra*_*erk 4 ssl node.js lets-encrypt

我尝试通过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)
}
Run Code Online (Sandbox Code Playgroud)

=>

{ 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' }
Run Code Online (Sandbox Code Playgroud)

因此,我尝试重新制作* .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
Run Code Online (Sandbox Code Playgroud)

并检查文件权限。

/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
Run Code Online (Sandbox Code Playgroud)

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

miv*_*ivk 12

我不熟悉 Node.js,但它显然与 PostgreSQL 存在相同的权限问题。所以同样的解决方案应该可以正常工作。这允许您保持权限/etc/letsencrypt不变

  • 将证书复制到您的 Node.js 目录
  • 将复制的文件 chown 到您的“node”用户

您可以使用一个脚本来执行此操作,/etc/letsencrypt/renewal-hooks/deploy每次更新证书时都会调用该脚本。

例子/etc/letsencrypt/renewal-hooks/deploy/10-certbot-copy-certs

#!/bin/bash

domain=domain.work # using your example name
node_dir=/path/to/cert_copies
node_user=nodeuser

cp /etc/letsencrypt/live/$domain/{fullchain,privkey}.pem "$node_dir"/
chown $node_user "$node_dir"/*.pem
Run Code Online (Sandbox Code Playgroud)


Sam*_*ody 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,并链接到from /etc/letsencrypt/live/${domain}/cert1.pem

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

$ sudo chmod +x /etc/letsencrypt/live
$ sudo chmod +x /etc/letsencrypt/archive
Run Code Online (Sandbox Code Playgroud)

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

解决方案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
Run Code Online (Sandbox Code Playgroud)

那应该允许节点使用证书访问文件夹,而不会向其他任何人打开它。

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

  • 我刚刚注意到了一些事情。如上所示的 `chmod 710` 为 `nodecert` 组提供了执行权限,但这仍然给了我 EACCES 错误。我也使用 `sudo chmod -R 750 /etc/letsencrypt/archive` 和 `sudo chmod -R 750 /etc/letsencrypt/live` 提供了读取权限,错误消失了。有道理,因为我们希望节点读取密钥/证书,而不是执行它们。(还添加了 `-R` 以使权限更改向下传播到文件本身。) (7认同)
  • @Chroaster:感谢“-R”递归指针。为了工作,我还为“sudo chgrp -R nodecert /etc/letsencrypt/live”执行了此操作。 (5认同)
  • `nodeuser` 是运行节点的用户的任意名称。如果 node 在 peter 下运行,那么你会做`sudo adduser peter nodecert`。除了运行 node 之外,您应该限制 peter 做其他事情,因为如果 node 受到威胁,攻击者将能够做任何 peter 能做的事情——这可能是实质性的。 (4认同)
  • 这帮助我们进行了一些更改(我使用的是 CentOS 7)。必须使用“sudo groupadd nodecert”而不是“sudo addgroup nodecert”。必须使用“sudo usermod -a -G nodecert username”而不是“sudo adduser username nodecert”。一切完成后必须执行“sudo chgrp -R nodecert /etc/letsencrypt/archive”(看起来 -R 是关键)。之后,节点就可以访问这些文件了,万岁! (3认同)
  • @SamGoody 您的解决方案对我有用。我也喜欢你用所有糟糕的选项回答它的方式。很有教育意义。只做`/etc/letsencrypt/live` 文件夹可以吗? (2认同)