我有基于名称的 SSL (SNI) 虚拟主机的 Apache 2.4.10。虚拟用户可以使用自己的证书并将其上传到服务器。
一切正常,直到证书文件出现错误(即文件丢失或名称错误)。
问题是,如果存在某些证书问题,Apache 将无法启动。
有没有什么解决方案可以解决此错误,即如何在启动 Apache 时避免出现此错误(即,除了一个出现故障的虚拟主机外,所有虚拟主机都将启动)?
这不起作用:
<If "-f '/path/to/file.crt'">
<VritualHost *:443>
SSLEngine On
SSLCertificateFile /path/to/file.crt
</VirtualHost>
</If>
...这也不起作用:
<VirtualHost *:443>
<If "-f '/path/to/file.crt'">
SSLEngine On
SSLCertificateFile /path/to/file.crt
</If>
</VirtualHost>
问题是配置中的语法错误“SSLEngine 不允许在这里”或“VirtualHost 不允许在这里”。因此,Apache 不允许我上面的配置。
非常感谢。
编辑:小打字错误
答案1
我想说,这是设计使然。SSL 证书是一种安全功能。为什么你会允许损坏的证书出现在你的系统上,这会危及整个服务器?
正如您所说,用户可以上传他们的证书,因此您需要实现这些证书的检查功能。毕竟,这些文件的有效性、拼写正确性和完整性应该由您的上传功能检查。
此外,apache 还附带一个配置检查器。
$SERVER/bin/apachectl configtest
使用此功能,您可以在重新启动之前检查您的配置文件,如果有任何错误,则不应重新启动服务器。
答案2
您不应该尝试在损坏的状态下启动 apache,而应该想办法验证用户上传的 SSL,并且只有它们有效时才应用于 apache 配置。
例如,如果以下两个 MD5 输出匹配,则证书(至少)有效(可以是自签名的,但仍然有效):
openssl x509 –noout –modulus –in <file>.crt | openssl md5
openssl rsa –noout –modulus –in <file>.key | openssl md5