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

Posted

技术标签:

【中文标题】让我们加密 SSL 无法以“错误:EACCES:权限被拒绝,打开 \'/etc/letsencrypt/live/domain.net/privkey.pem\'”开始【英文标题】:Let's encrypt SSL couldn't start by "Error: EACCES: permission denied, open '/etc/letsencrypt/live/domain.net/privkey.pem'"让我们加密 SSL 无法以“错误:EACCES:权限被拒绝,打开 '/etc/letsencrypt/live/domain.net/privkey.pem'”开始 【发布时间】:2018-06-13 04:03:51 【问题描述】:

我尝试通过 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

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

【问题讨论】:

以 root 身份运行脚本? 看起来您需要使您的脚本可执行。例如:chmod +x /root/letsencrypt.sh。但是通过您的帖子,我无法理解您在哪里出错。也许您可以添加更多详细信息? 是的。我运行了脚本sudo npm start Letsencrypt 生成由 Apache SSL 证明的有效证书/密钥。虽然使用 Node.js,但由于权限被拒绝而失败。 SamGoody 接受的答案的解决方案#4 对我有用,但命令对我不起作用,如所述。相反,我必须使用su rootswitch user 设为root,然后将cd 转换为/etc/letsencrypt/...,并结合使用解决方案#4 命令和ls -la 来检查组状态。否则我发现文件没有按要求更改!一旦我与ls -la 确认文件组确实已更改,它就可以正常工作了。 【参考方案1】:

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

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

您可以使用 whoamips aux | grep node 让您的用户使用 ubuntu

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

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

解决方案 #3(也不要这样做): 向所有人开放证书。 证书存储在/etc/letsencrypt/archive/$domain/cert1.pem,并链接到/etc/letsencrypt/live/$domain/cert1.pem

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

$ 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 -R nodecert /etc/letsencrypt/live
$ sudo chgrp -R nodecert /etc/letsencrypt/archive

// Allow group to open relevant folders
$ sudo chmod -R 750 /etc/letsencrypt/live
$ sudo chmod -R 750 /etc/letsencrypt/archive

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

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

在 ec2 实例上,您可以执行 sudo reboot

如果出现问题并且您想恢复到原始设置,请按照此操作

// Delete Group
$ sudo groupdel nodecert
    
// Reset Permission
$ sudo chown -R :root /etc/letsencrypt/live
$ sudo chown -R :root /etc/letsencrypt/archive
    
// Check Permissions
$ sudo ll /etc/letsencrypt/

【讨论】:

nodeuser 是用户运行节点的任意名称。如果 node 在 peter 下运行,那么你会做sudo adduser peter nodecert。除了运行 node 之外,您应该限制 peter 做其他事情,因为如果 node 受到威胁,攻击者将能够做 peter 可以做的任何事情 - 这可能是实质性的。 @SamGoody 您的解决方案对我有用。我也喜欢你用所有不好的选择来回答它的方式。很有教育意义。只做/etc/letsencrypt/live 文件夹可以吗? 我刚刚注意到一些事情。 chmod 710 如上所示为 nodecert 组提供了执行权限,但这仍然给我 EACCES 错误。我还使用sudo chmod -R 750 /etc/letsencrypt/archivesudo chmod -R 750 /etc/letsencrypt/live 授予了读取权限,并且错误消失了。这是有道理的,因为我们希望节点读取密钥/证书,而不是执行它们。 (还添加了-R 以使权限更改传播到文件本身。) @Chroaster:感谢-R 递归指针。为了工作,我也为sudo chgrp -R nodecert /etc/letsencrypt/live 做了这个。 这帮助我们进行了一些更改(我在 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 是关键)。之后,节点就可以访问文件了,哇!【参考方案2】:

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

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

您可以在 /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

【讨论】:

谢谢,这成功了。不知何故,当我是所有者(root 除外)时,我什至无法访问 /etc/letsencrypt/live/yoursite/fullchain.pem 和 privkey.pem 中的文件 证书更新后是否有效 @DragonFire :是的,.../renewal-hooks/deploy/ 下的脚本每次更新证书时都会运行(顾名思义)【参考方案3】:

这对我有用:

    将所需的所有 pem 文件复制到项目的根文件夹中:

sudo cp /etc/letsencrypt/live/www.your-domain.com/privkey.pem /home/your-username/your-server-directory/privkey.pem

    像这样读取文件:
.createServer(
    
      key: fs.readFileSync("privkey.pem"),
      cert: fs.readFileSync("cert.pem"),
    ,
    授予权限:

sudo chown your-username -R privkey.pem

【讨论】:

【参考方案4】:

我在 Amazon Linux 2 实例上使用 ec2-user 并遇到了同样的问题。这对我有用:

sudo chown ec2-user -R /etc/letsencrypt

【讨论】:

这是否有任何安全隐患。【参考方案5】:

@SamGoody 的上述最佳答案对我不起作用,因为它没有设置所有组权限。在我按照他的建议设置 nodecert 组后它就起作用了

$ sudo addgroup nodecert
$ sudo adduser nodeuser nodecert
$ sudo adduser root nodecert

然后做了

$ sudo nautilus

然后点击 /etc/letsencrypt 然后右键点击“属性”并手动将组权限更改为以下两个文件夹及其域名子文件夹中的 nodecert“访问文件”

/etc/letsencrypt/live
/etc/letsencrypt/archive

还将所有包含的文件和符号链接的组权限手动更改为 nodecert“只读”。

【讨论】:

以上是关于让我们加密 SSL 无法以“错误:EACCES:权限被拒绝,打开 '/etc/letsencrypt/live/domain.net/privkey.pem'”开始的主要内容,如果未能解决你的问题,请参考以下文章

sh TLS / SSL - 让我们加密免费的SSL证书安装脚本

text SSL - Wordpress /让我们加密

powershell SSL让我们加密

ini TLS / SSL - 让我们加密免费的SSL证书虚拟主机示例

提供到没有 ssl 证书的网站的加密连接

markdown Menggunakan certbot untuk menerbitkan SSL Certificate dari yang di签名oleh让我们加密di localhost u