我正在尝试设置我们的服务器以允许通过 SSL 进行流量。我知道 SSL 不适用于名称虚拟主机,但我们所有的 Apache 服务器都位于具有专用私有 IP 的虚拟机上。我们有一个主虚拟机,它具有 mod_proxy 设置,可将流量路由到适当的虚拟机。
但是,为了路由 HTTPS 流量,我们需要在代理和虚拟机上安装证书。我们有一个可以在我们所有主机上使用的通配符证书。一切似乎都工作正常,但我在代理的 Apache 日志中收到以下内容:
[警告]初始化:SSL 服务器 IP/端口冲突:
host1.example.com:443
(/etc/apache2/sites-enabled/host1:1) 与 host2.example.com:443
(/etc/apache2/sites-enabled/host2:1)
我们在代理上设置的每个主机都会出现以下错误消息之一。我们的代理虚拟主机设置如下:
<VirtualHost ipaddress:443>
ServerName host1.example.com
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / https://privateip:443/
ProxyPassReverse / https://privateip:443/
SSLProxyEngine on
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
</VirtualHost>
有什么办法可以让它发挥作用吗?
听起来 Apache 正在警告您,您有多个具有相同 IP 地址和端口的
<VirtualHost>
部分...就让它在没有警告的情况下工作而言,我认为您需要使用诸如服务器名称指示(SNI ),一种识别作为 SSL 握手一部分请求的主机名的方法。基本上它可以让你通过 SSL 进行基于名称的虚拟主机,但我不确定浏览器对它的支持程度如何。除了 SNI 之类的内容之外,您向公共互联网公开的每个 IP 地址基本上只能使用一个启用 SSL 的域名。
当然,如果您能够正确访问这些网站,您可能可以忽略这些警告。这些特定的问题并不是很严重 - 它们主要表明您遇到问题时要注意什么
据我所知,Apache从2.2.12版本开始支持SNI 遗憾的是,文档尚未反映这一变化。
前往 http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI 直到完成
您也许可以更换:
VirtualHost ipaddress:443
与
VirtualHost *:443
您可能需要在所有虚拟主机上执行此操作。
它可能会清除该消息。让 ServerName 指令负责路由消息请求。
再次强调,如果同一台机器有多个 ip 别名,则可能无法执行此操作。
虚拟主机看起来像这样:
NameVirtualHost IP_Address:443
<VirtualHost IP_Address:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt # Where "ca" is the name of the Certificate
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
ServerAdmin [email protected]
DocumentRoot /var/www/html
ServerName www.example.com
ErrorLog logs/www.example.com-error_log
CustomLog logs/www.example.com-access_log common
</VirtualHost>
首先您需要在配置文件中添加 NameVirtualHost ip:443! 您可能有一个结尾为 80 的,但您还需要一个结尾为 443 的。
其次你需要一个 *.domain 证书(通配符)(可以制作一个)
第三,你只能在一个ip中创建something.domain网站(因为证书)
您必须添加以下部分才能启用给定 IP 的
NameVirtualHost
功能。
NameVirtualHost IP_Address:443
Apache 在基于名称的虚拟主机上不支持 SSL,仅在基于 IP 的虚拟主机上支持。
来源:Apache 2.2 SSL FAQ 为什么无法使用基于名称的虚拟主机来识别不同的 SSL 虚拟主机?
与 SSL 不同,TLS 规范允许基于名称的主机(其他人提到的 SNI),但 Apache 尚不支持此功能。当针对 openssl 0.9.8 编译时,它应该会出现在未来版本中。
另外,mod_gnutls声称支持SNI,但我从未真正尝试过。
我创建了
/var/www/sponsorship.jaimemontoya.net
来包含我想要显示的内容。然后我用以下内容创建了/etc/apache2/sites-available/sponsorship.jaimemontoya.net-le-ssl.conf
:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName sponsorship.jaimemontoya.net
ServerAlias www.sponsorship.jaimemontoya.net
DocumentRoot /var/www/sponsorship.jaimemontoya.net
ErrorLog /error.log
CustomLog /access.log combined
</VirtualHost>
</IfModule>
我使用
a2ensite sponsorship.jaimemontoya.net-le-ssl.conf
启用了该站点,之后,我使用 systemctl reload apache2
激活了新配置。这对我有用。我希望它有帮助。
我在 https://jaimemontoya.com/blog/2023/11/17/13/08/发布了此解决方案,并附有一些屏幕截图和额外详细信息。