让我们加密 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 root
将s
witch u
ser 设为root,然后将cd
转换为/etc/letsencrypt/...
,并结合使用解决方案#4 命令和ls -la
来检查组状态。否则我发现文件没有按要求更改!一旦我与ls -la
确认文件组确实已更改,它就可以正常工作了。
【参考方案1】:
当您使用 sudo 颁发证书时,它们将归 root 所有。 由于 node 不是以 root 身份运行的,并且证书文件夹的权限不允许除所有者之外的任何人打开它们,因此您的 node 应用程序看不到它们。
为了理解解决方案,我们假设 node 以用户 nodeuser
运行
您可以使用 whoami
或 ps 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/archive
和sudo 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
上的权限:
您可以在 /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证书安装脚本
ini TLS / SSL - 让我们加密免费的SSL证书虚拟主机示例
markdown Menggunakan certbot untuk menerbitkan SSL Certificate dari yang di签名oleh让我们加密di localhost u