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

Nat*_*han 5 ssl apache-2.4 lets-encrypt

我正在使用 Let's Encrypt ( certonly) 为 Apache 服务器上托管的多个网站生成 SSL 证书。这些证书的文件位置在创建之前就已确定,因此我提前将它们的路径写入我的虚拟主机配置中。站点运行后,我将使用certbot获取证书文件,然后重新加载 Apache 配置。

我还有一个使用有效文件定义的全局 SSL 证书,因此每个 SSL 虚拟主机肯定都有一个证书。

我遇到的问题是 Apache 不会在没有所有证书文件的情况下运行,尽管有全局后备。我试图有条件地配置 Let's Encrypt 证书,仅当文件存在时使用IF,但 Apache 说SSLCertificateFile not allowed here.

SSLCertificateFile仅当新证书文件存在时,我如何才能覆盖全局?我正在尝试执行所有这些操作,而无需在生成证书之前和之后修改配置。

这是我尝试过的:

<If "-f '/etc/letsencrypt/live/domain/fullchain.pem'">
  SSLCertificateFile /etc/letsencrypt/live/domain/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem
</If>
Run Code Online (Sandbox Code Playgroud)

??SSLCertificateFile not allowed here

小智 8

您可以使用IfFile代替If

<IfFile "/etc/letsencrypt/live/www.example.com/fullchain.pem">
SSLEngine on     
...  
</IfFile>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为IfFile条件是在启动时评估的:

Encloses directives that will be processed only if file exists at startup
Run Code Online (Sandbox Code Playgroud)

而在运行时If评估:

Contains directives that apply only if a condition is satisfied by a request at runtime
Run Code Online (Sandbox Code Playgroud)

配置 SSLEngine 必须在启动时完成,不能在运行时完成。

引用来自Apache 2.4 Core Features 文档

  • 这太棒了。您可能还希望检查同一目录中是否也存在“privkey.pem”。(“fullchain.pem”和“privkey.pem”就足够了。)只需两个 &lt;IfFile&gt; 指令,一个嵌套在另一个中,即可出色地工作。 (3认同)

Cra*_*son 2

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

SSLCertificateFile /etc/ssl/domains/example.com/fullchain.pem
SSLCertificateKeyFile /etc/ssl/domains/example.com/privkey.pem
Run Code Online (Sandbox Code Playgroud)

这样做的优点是,在为域生成 Let's Encrypt 证书时只需要替换符号链接,但是在安装完整证书之前访问该域的用户将收到警告,因为蛇油证书是自签名的。