具有动态 apache 虚拟主机的非通配符证书

Posted

技术标签:

【中文标题】具有动态 apache 虚拟主机的非通配符证书【英文标题】:Non-wildcard certificates with dynamic apache vhosts 【发布时间】:2017-05-28 21:07:16 【问题描述】:

我正在尝试根据用于连接我的服务器的 url 动态读取 SSL 证书的位置。我尝试了几种不同的方法,但似乎都没有奏效。目前我有如下所述的配置

UseCanonicalName Off

listen 443

<VirtualHost *:443>
  ServerName example
  ServerAlias *

  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/%0/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/%0/privkey.pem

  VirtualDocumentRoot /var/www/vhosts/%-2/%-3+/public
</VirtualHost>

这里的问题是,当我启动 apache 时,我收到一条错误消息,说它找不到 ssl 证书的文件位置,说明“/etc/letsencrypt/live/%0/cert.pem”

所以看起来 %0 没有被 url 替换。

编辑:当我手动将 %0 替换为 url 时,说 url 有工作 SSL

【问题讨论】:

【参考方案1】:

来自documentation:

变量 %0 引用请求的服务器名称,如 Host: 标头中所示。

Host 标头是 HTTP 请求的一部分。 HTTP 请求仅在 TLS 握手成功后可用。此握手需要证书。因此,%0 不能用于指定证书的路径。

我怀疑任何其他变量都可能用于此目的,因为证书是在启动时加载的,因此文件名必须在启动时就已经可用。

【讨论】:

如果是这种情况,apache最初是如何知道它应该与哪个虚拟主机通信的?我想它使用不同的来源来获取服务器名称。我不能也使用相同的来源吗? @Fennek:我不确定你在问什么。 Apache 不与任何虚拟主机“对话”,但 Apache 是该主机的服务器。对于您想要拥有的所有虚拟主机,您将提供具有特定 ServerName 和证书的虚拟主机配置。 我很抱歉或措辞不好。我知道它不会与主机交谈。我的意思是apache最初如何知道它应该发送哪个虚拟主机的证书?无论 apache 决定这一点,我不能在那里动态选择证书,而不是将其“硬编码”到 vhost 配置文件中吗? 我不完全了解 apache 在后台是如何工作的,如果我的问题很奇怪,请见谅。 @Fennek:根据 ClientHello 消息中的 SNI TLS 扩展内容(即在 TLS 握手期间)决定提供哪个证书。就像我在回复中所说的那样,TLS 握手是在 HTTP 请求完成之前完成的,因此在 TLS 握手时不会从 Host 标头(包含在 HTTP 请求中)填充 %0

以上是关于具有动态 apache 虚拟主机的非通配符证书的主要内容,如果未能解决你的问题,请参考以下文章

nginx 为通配符域配置不同的证书

Certbot DNS/apache 通配符不适用于双子域?

nginx 和一个域的两个证书(EV nad 通配符)

通配符SSL证书的作用有哪些

Windows中的Apache通配符虚拟主机(xampp)[重复]

Apache:使用通配符永久重定向到 HTTPS