关键在于守住权限、路径、加载链三环节:私钥文件须chmod 600且chown root:root,禁用符号链接,路径各层目录需有执行权限,并适配SELinux/AppArmor策略。
要真正用好 Apache 的 SSLCertificateKeyFile 保护私钥,关键不是“写对路径”,而是守住权限、路径、加载链三个环节。Apache 启动时以 root 身份读取私钥,之后立即降权运行子进程;若私钥文件本身或其路径存在权限松动,攻击者就可能在 Web 进程被入侵后直接窃取私钥。
私钥文件不能是开放权限,哪怕只多一个“组可读”(640)或“其他可读”(604)都不行:
chmod 600 /etc/ssl/private/example.com.key,确保只有属主能读写chown root:root /etc/ssl/private/example.com.key,属主必须是 root(不是 www-data 或 apache)/var/www/html/)、用户家目录(如 /home/deploy/certs/)或任何 HTTP 可达路径下Linux 下访问文件依赖完整路径的执行权限(x),缺一层就会报 Permission denied:
/etc/ssl/private/(Debian/Ubuntu)或 /etc/pki/tls/private/(RHEL/CentOS),这些目录默认权限为 700,属主为 rootnamei -l /etc/ssl/private/example.com.key,确认每一级目录至少有 x 权限,且无 700 目录卡住非 root 用户/opt/app/config/ssl/private/ 增加了四层校验点,任一环节出错都导致加载失败Apache 默认拒绝通过符号链接加载私钥,即使目标文件权限正确,也会报 SSL Library Error: error:0200100D:system library:fopen:Permission denied:
SSLCertificateKeyFile /etc/ssl/private/example.com.key
ls -l /etc/ssl/private/example.com.key,若看到 -> 符号,说明是软链,应删除后重建真实文件ln /real/key /link/name),它不触发 symlink 检查,且保持 inode 一致在启用强制访问控制的系统上,仅文件权限不够,还需策略允许 httpd 进程读取私钥:
ls -Z /etc/ssl/private/example.com.key,确认上下文类型为 cert_t 或 httpd_cert_t
sudo semanage fcontext -a -t httpd_cert_t "/etc/ssl/private(/.*)?" 添加规则,再执行 restorecon -Rv /etc/ssl/private/
/etc/apparmor.d/usr.sbin.apache2 中包含对私钥路径的 read 规则