使用sudo特权通过pm2启动NodeJS以访问SSL密钥

时间:2019-03-02 20:05:58

标签: node.js ssl ubuntu-16.04 file-permissions pm2

我有一个运行Ubuntu 16.04的数字海洋小滴。我跟随this guide在NodeJS服务器上使用HTTPS。

简而言之

我使用certbot创建了SSL证书,这意味着在此目录 /etc/letsencrypt/live/yourdomain.com/上创建了3个文件:

  1. privkey.pem
  2. cert.pem
  3. chain.pem

因此,在我的服务器代码中,我必须获取这些文件,我这样做:

// Certificate
const privateKey = fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/privkey.pem', 'utf8');
const certificate = fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/cert.pem', 'utf8');
const ca = fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/chain.pem', 'utf8');

问题

当我尝试使用命令node server或使用pm2 start server运行服务器时,收到以下错误消息:

  { Error: EACCES: permission denied, open '/etc/letsencrypt/live/yourdomain.com/privkey.pem'
    at Object.fs.openSync (fs.js:646:18)
    at Object.fs.readFileSync (fs.js:551:33)
    at Object.<anonymous> (/home/myuser/mywebsite/lib/server-configurations.js:13:21)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
  errno: -13,
  code: 'EACCES',
  syscall: 'open',
  path: '/etc/letsencrypt/live/yourdomain.com/privkey.pem' }

但是

当我尝试使用sudo node server启动它时,它确实正常工作。

小通知

我知道我可以更改文件的权限,但是我不愿意这样做,因为我已经读过很多遍,最好不要更改这些文件的权限。

最重要的是...

谢谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

我确实根据Let's encrypt SSL couldn't start by "Error: EACCES: permission denied, open '/etc/letsencrypt/live/domain.net/privkey.pem'"更改了权限 可以运行

节点file.js

到目前为止,即使pm2的进程应该以与节点相同的用户身份运行,还是无法访问证书...。

答案 1 :(得分:0)

您可以使用this certbot script

More info on certbot renewals以及该问题on the Let's Encrypt forums的其他解决方案可能会有所帮助。