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

Linux Apache如何访问根用户创建的SSL证书?,linux,apache,nginx,apache2,sysadmin,Linux,Apache,Nginx,Apache2,Sysadmin,我有一个Debian服务器,在上面运行ApacheHTTPD 我已将其配置为使用驻留在/etc/SSL/private/中的某些SSL证书。只有根用户具有对此目录的读写访问权限。HTTPD进程以www数据用户的身份运行,但它是由root用户使用init.d脚本(HTTP安装附带)启动的 当apache2进程作为www数据运行并且SSL证书只能由root用户读取时,Apache如何能够读取证书并正常工作 我为用Python编写的自定义服务器编写的init.d脚本也面临类似的问题。只要我不使用SSL

我有一个Debian服务器,在上面运行ApacheHTTPD

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

当apache2进程作为www数据运行并且SSL证书只能由root用户读取时,Apache如何能够读取证书并正常工作

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

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

当您运行

ps aux | grep apache2

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

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

你能试试吗

sudo chown root:ssl-cert /etc/ssl/private/your-private.key
重新加载apache并再次检查

我已经清除了服务器上的所有Apache2安装,因此无法再进行测试

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

当启动时,它(通常)应该使用root启动(部分原因是您必须与system service manager一起使用
sudo
才能正确启动它)。此外,父进程(以根用户身份运行)然后读取中的配置,绑定到给定的(通常为80和443)和其他任务。还考虑了这些端口(1024以下的任何端口)。一旦完成,它将产生子进程(也可以通过核心使用“”

由于父进程是根进程,并且子进程/工作进程在“www data”(或另一个非特权用户)下运行,Apache仍然可以绑定到系统端口,并以这种方式处理根特权文件,如私有SSL密钥/etc

“在Unix下,为了绑定到端口80,父进程通常以root用户身份启动,而子进程和线程则被启动 由服务器作为权限较低的用户执行。用户和组指令 用于设置Apache HTTP服务器子级的权限 进程。子进程必须能够读取所有内容 这将得到满足,但除此之外,应尽可能少地享有特权 可能。此外,除非使用suexec,否则这些指令也 设置CGI脚本将继承的权限。*”


嗯,有可能,但仍然没有足够的证据证明这一点。dod lsof-p PID_OF_ROOT_拥有_进程,但没有得到任何可以表明此进程正在保存证书文件的fd的信息。用户可能阅读了内容,然后发布了fd。但正如我所说,这不是结论性的回答很好。。我已经详述了为什么Apache是root,而不是“www数据”或其他任何人。这些只是孩子/工作者,而不是家长。问题是Apache无法访问密钥。实际上,它可以使用root:root所有权访问它们/etc/ssl具有root:ssl证书所有权,但密钥文件具有root:root所有权。一切正常。我看到了这篇文章,这可能是最好的解释之一。当然,它在root下可以正常运行,但我想你只是不希望它以root身份运行。因此,如果你注意到在
ps
命令弹出的进程列表中,Apache是以www数据用户而不是root用户的身份运行的。此用户也未添加到ssl证书组中。因此,该用户无权访问任何证书,即私人证书或公共证书。但是,init.d脚本始终作为根运行。我假设证书由Apache的init.d脚本获取并以某种方式传递给它。这听起来是正确的还是正确的?我不明白的是,通常情况下,initd在启动时启动具有root权限的进程。我认为apache开始运行under根用户,然后在www数据下分叉其工作程序。在根目录下的init中,它应该能够读取私有安全密钥。当使用服务命令时,您还需要使用根目录帐户,以便。。。权利应该足够了“我面临着类似的问题”>你的第一个问题是什么?我看不出来?另外,为什么您的“自定义”服务器初始化脚本是用python编写的?使用为您的操作系统提供的系统服务器初始化脚本启动Apache;这就是它的用途,并且经过了彻底的测试。然后,您可以使用python与作为root用户运行的服务器进行交互。不要以任何其他方式启动服务器!使用python脚本启动Apache或任何其他系统/根目录服务背后的原因是什么?感谢@bshea提供的简单且编写良好的解释,来到这里是因为同样的原始问题,因为当运行“apache2ctl-t”时会抛出错误“SSLCertificateKeyFile:file'/etc/ssl/private/server.key'不存在或为空”如预期或更好,现在我理解了原因,因为只有“sudo apache2ctl-t”可以在访问需要根权限的文件时执行语法检查。:)