You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js应用通过PM2运行时无法读取Let's Encrypt证书权限问题

Let's Encrypt证书PM2启动应用权限问题排查与解决

问题背景

我有一个归属root用户的Let's Encrypt证书,已创建ssl-group用户组并将www-data加入其中,还对/etc/letsencrypt目录执行了chgrp -R ssl-group操作。应用部署在/var/www/app目录,归属www-data用户。

测试文件test.js内容:

const fs = require('fs');
const key = fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem');
const cert = fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem');
console.log("cert",cert);
console.log("key",key);

直接运行该文件可正常读取证书,但通过PM2启动真实应用(执行pm2 start ecosystem.json)时,server.js中相同代码报错:

Error: EACCES: permission denied, open '/etc/letsencrypt/live/example.com/privkey.pem'

证书文件权限信息:

lrwxrwxrwx 1 root ssl-group 43 Feb 28 07:48 /etc/letsencrypt/live/example.com/privkey.pem -> ../../archive/example.com/privkey1.pem

以www-data身份登录后用vi可正常查看证书。进程列表:

www-data   15503  0.1  6.6 852008 66232 ?        Ssl  07:58   1:07 PM2 v5.2.2: God Daemon (/var/www/.pm2)
root       15768  0.0  5.2 644908 52160 ?        Ssl  08:03   0:01 PM2 v5.2.2: God Daemon (/root/.pm2)
www-data   33543  110  6.4 666576 63888 ?        Rsl  19:03   0:01 node /var/www/app/server.js

应用进程归属www-data但仍无法读取证书,尝试添加pm2用户到ssl-group提示用户不存在。

问题原因

  1. PM2启动身份导致权限继承异常:进程列表显示存在root用户的PM2守护进程,说明你可能用root执行了pm2 start。此时即使应用进程显示为www-data,其有效组权限可能未包含ssl-group——用户组变更需要重新登录或重启进程才能生效,root启动的PM2不会自动继承www-data的完整组权限。
  2. 软链接权限链不完整:/etc/letsencrypt/live/下的文件是软链接,实际指向/etc/letsencrypt/archive/目录下的文件。若archive目录或下属文件的组权限未设置为ssl-group,或目录缺少组执行权限(g+x),即使软链接权限正确,也无法访问实际证书文件。

解决方法

1. 以www-data身份启动PM2

  • 先终止所有PM2进程:
    pm2 kill
    
  • 切换到www-data用户启动应用:
    su - www-data -c "pm2 start ecosystem.json"
    
    或用sudo指定用户:
    sudo -u www-data pm2 start ecosystem.json
    
    这样PM2守护进程和应用进程都会以www-data的完整权限运行,自然继承ssl-group的组权限。

2. 修复证书目录的完整权限链

  • 确保/etc/letsencrypt下所有目录和文件的组权限正确,且目录具备组执行权限:
    sudo chgrp -R ssl-group /etc/letsencrypt
    sudo chmod -R g+rX /etc/letsencrypt
    
    其中X参数仅为目录添加执行权限,不会修改证书文件的权限(证书文件无需执行权限)。

3. 验证并更新www-data的组权限

  • 确认www-data已加入ssl-group:
    groups www-data
    
  • 若未加入,执行添加命令:
    sudo usermod -aG ssl-group www-data
    
  • 重启PM2应用,让进程继承新的组权限:
    pm2 restart all
    

内容的提问来源于stack exchange,提问作者oderfla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:07:50