繁体   English   中英

Apache如何访问root用户创建的SSL证书?

[英]How does Apache access SSL certs created by root user?

我有一台运行 Apache HTTPD 的 Debian 服务器。

我已将其配置为使用驻留在 /etc/ssl/private/ 中的某些 SSL 证书。 只有 root 用户对该目录具有读写访问权限。 HTTPD 进程以 www-data 用户身份运行,但它是由 root 用户使用 init.d 脚本(HTTP 安装附带的)启动的。

当 apache2 进程作为 www-data 运行并且 SSL 证书只能由 root 用户读取时,Apache 如何能够毫无问题地读取证书和功能?

我为用 Python 编写的自定义服务器编写的 init.d 脚本也面临着类似的问题。 只要我不使用 SSL 证书,这个 init.d 脚本就可以正常工作。 一旦我添加了这些证书,该过程就不会开始,因为它无法读取证书,因为 www-data 用户无法读取证书。

我也在类似的情况下使用了 nginx,结果与使用 Apache 时的结果相似。 那么这两个项目是如何解决这个问题的呢?

当你跑

ps aux | grep apache2

你会注意到有一个root拥有的进程,我认为这可能是原因,因为这个进程可以访问root拥有的文件/目录。

在大多数情况下,Root 运行 Apache。
因此 root 是主“父”进程的所有者。

Apache 启动时,它(通常)应该是使用 root 启动的(部分原因是您必须将sudo与系统服务管理器一起使用才能正确启动它)。 此外,父进程(以 root 用户身份运行)然后读取配置,绑定到给定的系统端口(通常是 80 和 443)和其他任务。 这些端口也被视为特权端口(低于 1024 的任何端口)。 完成后,它会生成子进程(也可以通过核心模块使用“ worker ”)。

由于父进程是 root 并且子进程/worker 运行在“www-data”(或其他非特权用户)下,Apache 仍然可以绑定到系统端口并在此处理 root 特权文件,例如私有 SSL 密钥/等方式。

“虽然父进程通常在 Unix 下以 root 身份启动以绑定到端口 80,但子进程和线程由服务器作为较低权限的用户启动。用户和组指令用于设置权限Apache HTTP Server 子进程。子进程必须能够读取将提供的所有内容,但应尽可能少地拥有超出此范围的权限。此外,除非使用 suexec,否则这些指令还设置了将要提供的权限由 CGI 脚本继承。*”

来自:https ://httpd.apache.org/docs/2.4/mod/prefork.html#how-it-works

只有私钥受到保护,因为证书在 /etc/ssl/certs 目录中是公开可用的。 /etc/ssl/private 仅 root 可读,但授予 ssl-cert 用户组执行(ssl-cert 组 X 权限)。 该系统组可能是 SSL 身份验证方法中涉及的系统组。

你能试试吗:

sudo chown root:ssl-cert /etc/ssl/private/your-private.key

重新加载apache并再次检查?

我已经清除了我服务器上的所有 Apache2 安装,所以我不能再测试了。

希望有帮助,问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM