当文件存在时,如何有条件地设置SSLCertificateFile?

我使用Let's Encrypt( certonly )为Apache服务器上托pipe的几个网站生成SSL证书。 这些证书的文件位置在创build之前是确定的,所以我提前将他们的path写入到我的虚拟主机configuration中。 一旦网站正在运行,我将使用certbot来获取证书文件,然后重新加载Apacheconfiguration。

我也有一个用有效文件定义的全局SSL证书,所以每个SSL虚拟主机肯定会有一个证书。

我遇到的问题是Apache不会运行没有所有的证书文件,尽pipe有一个全球性的后备。 我试图有条件地configurationLet's Encrypt证书只有当文件存在使用IF ,但Apache说SSLCertificateFile not allowed here

只有当新的证书文件存在时,我如何覆盖全局SSLCertificateFile ? 我试图做所有这些,而不必在生成证书之前和之后修改configuration。

这是我试过的:

 <If "-f '/etc/letsencrypt/live/domain/fullchain.pem'"> SSLCertificateFile /etc/letsencrypt/live/domain/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem </If> 

SSLCertificateFile not allowed here

在这种情况下,我将为每个域创build一个符号链接目录,并为尚未configuration的域使用服务器的snakeoil证书(或您之前提到的“全局”证书)。 例如:

 $ ls -1 /etc/ssl/domains example.com/fullchain.pem -> /etc/letsencrypt/live/example.com/fullchain.pem example.com/privkey.pem -> /etc/letsencrypt/live/example.com/privkey.pem second-example.com/fullchain.pem -> /etc/ssl/certs/ssl-cert-snakeoil.pem second-example.com/privkey.pem -> /etc/ssl/private/ssl-cert-snakeoil.key 

然后,您可以设置Apache指令来使用符号链接目录:

 SSLCertificateFile /etc/ssl/domains/example.com/fullchain.pem SSLCertificateKeyFile /etc/ssl/domains/example.com/privkey.pem 

这样做的好处是只需要在为域生成Let's Encrypt证书时replace符号链接,但是安装完整证书之前访问域的用户将因为snakeoil证书是自签名而收到警告。

另一个想法:如果我理解正确,你有一个全球性的虚拟主机,然后其他虚拟主机,每个网站。 如果该网站还没有关联的SSL证书,则根本不应configuration它。 您可以将每个网站configuration放在自己的文件中,并且有2个目录: sites-enabled sites-waitingsites-waiting Apacheconfiguration,声明包括sites-enabled所有内容。 当您的网站被configuration(意味着它有SSL证书),您只需要将其configuration从一个目录移动到另一个目录,然后重新加载Apache。

这种设置是由各种Linux发行版完成的。

实际上,我在所有虚拟主机的同一目录中都有.well-known别名。 这样,当新虚拟主机未启用时,通过默认的虚拟主机可以访问该问题。