我有一个在 Ubuntu 14.04 LTS 上运行的 apache 2.4 网络服务器。
是否可以仅为单个 VirtualHost 启用 SSL,而使其他 VirtualHost 不受影响(包括默认 VirtualHost)?
例如,在我的 Web 服务器中,我有通过 HTTP 运行的以下站点:
000-default.conf
hello.com.conf
welcome.com.conf
secure.com.conf
我没有default-ssl.conf
启用。
现在我想secure.com.conf
在 HTTPS(:443)下运行,因此我启用了 ssl 插件并a2enmod ssl
以这种方式更改了 VHost 配置:
<VirtualHost *:443>
ServerName www.secure.com
...
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.secure.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.secure.com/privkey.pem
</VirtualHost>
无论如何,当我重新启动 Apache 时,service apache2 restart
它会失败并显示:
[ssl:emerg] AH02240: Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] ((null):0)
[ssl:emerg] AH02312: Fatal error initialising mod_ssl, exiting.
编辑:
通过添加SSLCertificateChainFile
配置,我设法启动了网络服务器......
无论如何,如果我尝试加载(仅用于测试)https://hello.com
,apache 现在想要为它和所有其他具有证书的 VirtualHosts 提供服务secure.com
,当然浏览器会出现错误: NET::ERR_CERT_COMMON_NAME_INVALID
答案1
该错误似乎表明 letsencrypt 证书在 SSLCertificateFile 位置不可用。没有证书,服务器无法提供 SSL。您是否正确安装了 letsencrypt 设置?通常,您的 /etc/ssl/certs 和 /etc/ssl/private 路径中有一个 snakeoil 自加密证书。您可以将其用于测试目的:服务器将正常运行,但浏览器会发出抱怨。
答案2
(1)检查你的私钥权限 (2)你的 CA CRT 在哪里?
所以一般我们需要:
a) 私钥,b) 服务器 CRT,c) 根/CA CRT。
这是一个例子
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
SSLCertificateChainFile /etc/pki/tls/certs/DigiCertCA.crt
答案3
如果你真的试图打https://hello.com(即 http SECURE),这是因为 Apache 解析正确的虚拟主机的方式。如Apache 文档,
基于名称的虚拟主机解析仅在将候选范围缩小到最佳基于 IP 的匹配后才选择最合适的基于名称的虚拟主机。当请求到达时,服务器将根据请求使用的 IP 地址和端口找到最佳(最具体)匹配参数。
如果在包含最具体的匹配 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则将使用匹配的第一个列出的虚拟主机。
因此,在这种情况下,由于您已请求端口 443 服务,因此服务器可以尝试的唯一选项是 www.secure.com 虚拟主机 (secure.com.conf)。由于此时 hello.com 与 secure.com 不匹配,因此您会看到此错误。
这个错误是应该发生的,因为没有 https://hello.com,只有 http://hello.com。如果您希望此类流量默认流向某个地方,您可以设置一个默认安全虚拟主机,将所有不匹配虚拟主机的安全流量重定向到具有正确证书的安全虚拟主机。