使用 SSL 解析多个基于 Apache 名称的虚拟主机

使用 SSL 解析多个基于 Apache 名称的虚拟主机

我的 httpd-ssl.conf 中有以下配置

NameVirtualHost *:8443

<VirtualHost _default_:8443>
ServerName sub.domain1.com
ServerAlias sub2.domain1.com
SSLEngine on
SSLCertificateFile "/path/to/file.crt"
SSLCertificateKeyFile "/path/to/file.key"
SSLCertificateChainFile "/path/to/chainFile.crt"
# some other settings...
</VirtualHost>

<VirtualHost _default_:8443>
ServerName www.domain1.com
ServerAlias domain1.com
SSLEngine on
SSLCertificateFile "/path/to/file.crt"
SSLCertificateKeyFile "/path/to/file.key"
SSLCertificateChainFile "/path/to/chainFile.crt"
Redirect permanent / http://www.domain1.com/
</VirtualHost>

<VirtualHost _default_:8443>
ServerName www.domain2.com
ServerAlias domain2.com
SSLEngine on
SSLCertificateFile "/path/to/file.crt"
SSLCertificateKeyFile "/path/to/file.key"
SSLCertificateChainFile "/path/to/chainFile.crt"
Redirect permanent / http://www.domain2.com/
</VirtualHost>

当我在浏览器中输入类似 的 URL 时https://www.domain2.com/resource-under-sub.domain1.com,它实际上会转到路径,https://sub.domain1.com/resource-under-sub.domain1.com而不是重定向到http://www.domain2.com。我的设置有什么问题?


回复@Nic 关于 SNI 的问题:

我检查了我的 Apache,从https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI日志消息中可以看出 SNI 已启用: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)。我还使用了 Firefox 56,它应该支持 SNI https://www.kinamo.be/en/support/faq/which-browsers-support-server-name-indication-sni。但是,当我转到第二个虚拟主机的 URL 时,它仍然会将我带到第一个默认虚拟主机。

对于我正在运行的 Apache 2.4,此https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI和此https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslprotocol建议默认设置支持 TLSv1 和 SNI。在我的错误和 SSL 日志中,它没有显示我对第二个虚拟主机的请求的任何记录,尽管它对其他主机有记录,例如,No matching SSL virtual host for servername other.domain1.com found (using default/first virtual host)从消息中可以看出,这些主机正在使用 SSLv3 OpenSSL: Loop: SSLv3 read client hello A。但是,我也可以从 SSL 请求日志中看到,TLSv1 正在用于某些资源:TLSv1 AES128-SHA "GET /javax.faces.resource/theme.css.seam...

我需要在配置中明确指定使用 TLSv1 吗SSLProtocol +TLSv1

谢谢


回复@dave_thompson_085:

谢谢,我尝试了以下配置,并清除了浏览器缓存:

NameVirtualHost _default_:8443

# Default virtual host and catch all
<VirtualHost _default_:8443>
ServerName www.domain1.com
ServerAlias www.domain1.com
SSLEngine on
SSLProtocol all -SSLv3
SSLCertificateFile "/path/to/file.crt"
SSLCertificateKeyFile "/path/to/file.key"
SSLCertificateChainFile "/path/to/chainFile.crt"
# I want to redirect the https to http
Redirect permanent / http://www.domain1.com/
</VirtualHost>

# This is the only virtual host name that should handle the ssl
<VirtualHost _default_:8443>
ServerName sub.domain1.com
ServerAlias sub2.domain1.com
SSLEngine on
SSLCertificateFile "/path/to/file.crt"
SSLCertificateKeyFile "/path/to/file.key"
SSLCertificateChainFile "/path/to/chainFile.crt"
# some other settings...
</VirtualHost>

<VirtualHost _default_:8443>
ServerName www.domain2.com
ServerAlias domain2.com
SSLEngine on
SSLCertificateFile "/path/to/file.crt"
SSLCertificateKeyFile "/path/to/file.key"
SSLCertificateChainFile "/path/to/chainFile.crt"
# I want to redirect the https to http
Redirect permanent / http://www.domain2.com/
</VirtualHost>

# Other virtual hosts like www.domain2.com

当我访问时https://www.domain2.com,这是我在error_log_ssl中得到的内容:

[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1830): +------------------------------+
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1869): | 0000: ...
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1869): | 0010: ...
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1869): | 0020: ...
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1869): | ...
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1869): | 0060: ... www.domain2.com |
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1869): | ...
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_io.c(1875): +------------------------------+
[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_kernel.c(1987): [client 207.46.13.160] SSL virtual host for servername www.domain2.com found
**[Mon Oct 16 08:10:07 2017] [debug] ssl_engine_kernel.c(1274): [client 207.46.13.160] handing out temporary 1024 bit DH key
**[Mon Oct 16 08:10:07 2017] [info] [client n1.n2.n3.n4] (70014)End of file found: SSL input filter read failed.
[Mon Oct 16 08:10:07 2017] [info] [client n1.n2.n3.n4] Connection closed to child 199 with standard shutdown (server www.domain2.com:443)

标有 ** 的行仅偶尔出现。似乎 SSL 命名虚拟主机从行 开始工作SSL virtual host for servername www.domain2.com found。在浏览器中,它显示证书不安全,因为它与服务器名称不匹配,如果我不接受证书,则不会继续,这很公平。但是,如果我接受证书,它仍然会重定向到sub.domain1.com真正处理 SSL 的站点。为什么它没有重定向到www.domain2.com设置中指定的?

非常感谢你的帮助!

答案1

使用常规 Apache 和 SSL 证书,您无法做到这一点。SSL 的协商已完成虚拟主机。因此,基本答案是每个网站获取一个 IP。

几年前,证书和浏览器开始支持 SNI 以绕过该限制。查找 SNI(服务器名称指示)。大多数最新浏览器现在都支持该功能。但请注意,使用旧浏览器的用户将无法访问您的所有网站(实际上,他们将始终尝试访问您的配置中定义的第一个 VirtualHost,这是名称虚拟托管不起作用时选择的默认设置)。

在您的问题中,您说总是发送到子域 1,这是合乎逻辑的,因为它采用找到的第一个 VirtualHost,正如我上面刚刚解释的那样。

相关内容