具有动态 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 虚拟主机的非通配符证书的主要内容,如果未能解决你的问题,请参考以下文章
Certbot DNS/apache 通配符不适用于双子域?