当前位置: 首页 > 知识库问答 >
问题:

让我们加密SSL不能从"错误:每一个:权限拒绝,打开'/etc/lets加密/live/domain.net/privkey.pem'"开始

满昊然
2023-03-14

我尝试按节点使用SSL。js,但它不工作,因为权限被拒绝

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' }

所以我试着重新制作*的文件。佩姆。

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

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

共有3个答案

於乐语
2023-03-14

这对我很有用:

  1. 将需要的所有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您的用户名-R privkey。pem

郑晨
2023-03-14

我不熟悉Node。js,但这显然是与PostgreSQL相同的权限问题。因此,同样的解决方案应该很有效。这允许您保留/etc/letsencrypt上的权限:

  • 将证书复制到您的节点。js目录
  • 将复制的文件传送给“节点”用户

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

示例/etc/letsencrypt/renewal hooks/deploy/10 certbot复制证书

#!/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
姜松
2023-03-14

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

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

您可以使用以下命令在ubuntu上获取用户:whoamips aux|grep node

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

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

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

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

$ 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 restart

如果出现问题,您希望恢复到原始设置,请遵循以下步骤

// 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/
 类似资料:
  • 我正在使用下面常用的库进行加密。我想从Mcrypt将其升级到OpenSSL,这样我就不再使用已弃用的库。 我试图找出这是否可能。我对此做了一些研究,但我发现了相互矛盾的信息: 这篇文章说不可能用OpenSSL解密用Mcrypt加密的数据。https://stackoverflow.com/a/19748494/5834657 但是,这篇文章说可以使用填充。我的函数似乎使用了填充。这是使其工作所需的

  • 我做过多次使用Git时如何解决权限拒绝(公钥)错误? 可以解决这个问题。但是当我重新打开git bash时,我必须重新做所有事情。我如何避免这种无聊的操作?

  • 我从Let's Encrypt获得了有效的https证书,但将其提供给vert时存在信任问题。x版本3.6.2 我用apache测试了cert,没问题,但是如果我试图用wget到达https vert. x服务器实例,我会得到: $wgethttps://www.myhost.mydomain/json/read/all-languages -2019-01-22 10:30:56--https:

  • 我已经创建了一个自定义内容提供者,它将被更多的应用程序访问。我已经在我的提供者AndroidManifest中包含了权限标记。xml文件,在第二个应用程序中,我包含了uses-permissions标记,但没有成功。Logcat向我展示: 我也搜索过类似的问题,但似乎一切都是正确的。有什么想法吗?谢谢 这是我的提供者AndroidManifest。xml文件: 这是我的第二个应用程序Android

  • 更新 结果发现我调用open和close FileOutputStream的频率太高了,这会在某个时候抛出FileNotFoundException。听起来更像是线程问题。