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

时间:2014-04-30 08:50:42

标签: linux apache nginx apache2 sysadmin

我有一台运行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相似。那么这两个项目如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

运行时

ps aux | grep apache2

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

答案 1 :(得分:1)

只有私钥受到保护,因为证书在/ 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安装,所以我不能再测试它了。

希望有所帮助, 问候

答案 2 :(得分:0)

Root运行Apache。因此,root是其下任何其他内容的主要进程(父进程)。

Apache starts时,它应该已经开始使用root(为什么必须使用sudo才能正确使用系统服务)。此外,当它开始时,父进程(root用户)读取(作为root)中的配置,绑定到给定的' system ports' (通常是80和/或443)和其他任务。完成后,它会生成子进程(也可以使用" workers"通过核心modules)。

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

  

"虽然父进程通常在Unix下以root身份启动,以便绑定到端口80,但子进程和线程已启动   由服务器作为权限较低的用户。用户和组指令   用于设置Apache HTTP Server子级的权限   流程。子进程必须能够读取所有内容   将被提供,但应该具有尽可能少的特权   可能。另外,除非使用suexec,否则这些指令也是如此   设置将由CGI脚本继承的权限。*"