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提示用户不存在。
问题原因
- PM2启动身份导致权限继承异常:进程列表显示存在root用户的PM2守护进程,说明你可能用root执行了
pm2 start。此时即使应用进程显示为www-data,其有效组权限可能未包含ssl-group——用户组变更需要重新登录或重启进程才能生效,root启动的PM2不会自动继承www-data的完整组权限。 - 软链接权限链不完整:
/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指定用户:
这样PM2守护进程和应用进程都会以sudo -u www-data pm2 start ecosystem.jsonwww-data的完整权限运行,自然继承ssl-group的组权限。
2. 修复证书目录的完整权限链
- 确保
/etc/letsencrypt下所有目录和文件的组权限正确,且目录具备组执行权限:
其中sudo chgrp -R ssl-group /etc/letsencrypt sudo chmod -R g+rX /etc/letsencryptX参数仅为目录添加执行权限,不会修改证书文件的权限(证书文件无需执行权限)。
3. 验证并更新www-data的组权限
- 确认
www-data已加入ssl-group:groups www-data - 若未加入,执行添加命令:
sudo usermod -aG ssl-group www-data - 重启PM2应用,让进程继承新的组权限:
pm2 restart all
内容的提问来源于stack exchange,提问作者oderfla
相关产品推荐
相关产品推荐

