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

Ubuntu 22.04环境下Node.js自建REST API服务器的SSL证书与私钥安全存储及权限配置问题

Ubuntu 22.04环境下Node.js自建REST API服务器的SSL证书与私钥安全存储及权限配置问题

兄弟我太懂你这种纠结了——想把SSL凭证放到系统标准的安全目录里,结果自己的Node.js服务器进程因为权限问题读不了,确实头疼。我之前在Ubuntu 22.04上搭Node.js REST API的时候也踩过这个坑,给你一步步捋清楚怎么解决:

一、先明确:/etc/ssl 目录是正确的选择

你选的/etc/ssl/private(存私钥)和/etc/ssl/certs(存证书)完全没问题,这是Ubuntu系统官方推荐的SSL凭证存储目录,比放在项目目录里安全N倍——毕竟项目目录可能会被提交到代码仓库、被其他用户随意访问,而系统目录的权限管控更严格。

二、核心:权限配置的正确姿势

问题出在权限上,默认这些目录和文件的所有权是root:root,但我们不需要把文件所有权改成Node.js进程的用户(那样反而不安全),而是通过组权限来给进程授权:

1. 先确认你的Node.js进程用哪个用户运行

首先得搞清楚,你的Node.js服务器是用哪个系统用户启动的——比如你可能专门创建了一个叫nodeapp的普通用户来跑服务(绝对不要用root跑,安全大忌!),或者用你的个人用户。记下来这个用户名,比如我这里就用nodeapp举例。

2. 配置私钥的权限(关键!私钥不能随便给权限)

私钥是绝对不能让无关用户读取的,所以先把私钥的基础权限锁死:

# 把私钥权限设为600(只有所有者能读、写,其他用户完全没权限)
chmod 600 /etc/ssl/private/your-private-key.pem
# 把私钥的所属组改成系统默认的ssl-cert组(这个组是专门给需要访问SSL凭证的服务用的)
chgrp ssl-cert /etc/ssl/private/your-private-key.pem

3. 让Node.js用户加入ssl-cert组

把你的Node.js进程用户加入ssl-cert组,这样它就能读取组权限开放的私钥了:

# -aG 表示追加组,不会覆盖用户原有的所属组
usermod -aG ssl-cert nodeapp

4. 确认private目录的权限

/etc/ssl/private目录的权限必须是710,这样只有root和ssl-cert组的用户能进入这个目录,其他用户连目录都进不去:

chmod 710 /etc/ssl/private

(PS:Ubuntu默认这个目录就是710权限,但最好手动确认一遍,避免被误改)

5. 配置证书文件的权限

证书是公开可访问的,所以权限宽松一点也没关系,设置成644即可:

chmod 644 /etc/ssl/certs/your-certificate.crt

三、最后一步:重启Node.js进程

因为我们给用户加了新的组,必须重启Node.js进程才能让组权限生效:

  • 如果是用systemd管理服务:systemctl restart your-node-service
  • 如果是直接用命令行启动:退出当前进程,用nodeapp用户重新启动

之后你的Node.js代码里用fs.readFileSync()读取这两个文件就完全没问题了。

额外安全小贴士

  • 永远不要把私钥的权限改成777、644之类的宽松权限,那等于把你的服务器私钥直接公开,黑客拿到就能伪造你的服务了!
  • 坚持用普通用户运行Node.js进程,不要用root——如果服务需要监听443端口(HTTPS默认端口),可以用setcap给node二进制文件加权限:setcap 'cap_net_bind_service=+ep' /usr/bin/node,这样普通用户也能监听1024以下的端口,不用root。

备注:内容来源于stack exchange,提问作者MisterSincere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 13:04:41