使用SSL的Apache名称虚拟主机

使用SSL的Apache名称虚拟主机,apache,ssl,ssl-certificate,Apache,Ssl,Ssl Certificate,我正在尝试将服务器设置为允许通过SSL进行通信。我知道SSL不适用于名称虚拟主机,但我们的所有apache服务器都位于具有专用专用IP的虚拟机上。我们有一个主虚拟机,它具有mod_代理设置,用于将流量路由到适当的虚拟机 但是,为了路由https流量,我们需要在代理和虚拟机上安装证书。我们有一个通配符证书,可以在所有主机上使用。一切似乎都正常工作,但我在代理的apache日志中收到以下内容: [警告]初始化:SSL服务器IP/端口冲突:host1.domain.com:443(/etc/apach

我正在尝试将服务器设置为允许通过SSL进行通信。我知道SSL不适用于名称虚拟主机,但我们的所有apache服务器都位于具有专用专用IP的虚拟机上。我们有一个主虚拟机,它具有mod_代理设置,用于将流量路由到适当的虚拟机

但是,为了路由https流量,我们需要在代理和虚拟机上安装证书。我们有一个通配符证书,可以在所有主机上使用。一切似乎都正常工作,但我在代理的apache日志中收到以下内容:

[警告]初始化:SSL服务器IP/端口冲突:host1.domain.com:443(/etc/apache2/sites enabled/host1:1)与host2.domain.com:443(/etc/apache2/sites enabled/host2:1)

对于我们在代理上设置的每个主机,都有一条这样的错误消息。代理的虚拟主机设置发布如下:

<VirtualHost ipaddress:443>
    ServerName host1.domain.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>

ServerName host1.domain.com
代理主机
代理请求关闭
ProxyPass/https://privateip:443/
ProxyPassReverse/https://privateip:443/
SSLProxyEngine打开
斯伦金安
SSLCertificateFile/etc/ssl/certs/server.crt
SSLCertificateKeyFile/etc/ssl/private/server.key

有什么方法可以让它工作吗?

听起来好像Apache在警告您,您有多个
节具有相同的IP地址和端口。。。至于让它在没有警告的情况下工作,我认为您需要使用类似服务器名称指示(SNI)的东西,这是一种识别SSL握手中请求的主机名的方法。基本上,它允许您通过SSL进行基于名称的虚拟托管,但我不确定浏览器对它的支持程度如何。除了像SNI这样的东西之外,对于公开到公共互联网上的每个IP地址,基本上只能有一个启用SSL的域名


当然,如果您能够正确访问这些网站,那么忽略这些警告可能会很好。这些特别的问题并不严重-它们主要是一个指示,表明如果您遇到问题,应该看什么

您可以更换:

VirtualHost ipaddress:443

您可能需要在所有virt主机上执行此操作

这可能会澄清这一信息。让ServerName指令来处理消息请求的路由问题


同样,如果同一台机器上有多个ip别名,则可能无法执行此操作。

Apache不支持基于名称的虚拟主机上的SSL,仅支持基于ip的虚拟主机上的SSL

来源:Apache 2.2 SSL常见问题解答

与SSL不同,TLS规范允许基于名称的主机(其他人提到的SNI),但Apache还不支持此功能。当根据openssl 0.9.8进行编译时,它可能会出现在未来的版本中


另外,声称支持SNI,但我从未真正尝试过。

据我所知,Apache从2.2.12版开始就支持SNI 遗憾的是,文件还没有反映出这一变化


继续,直到完成此操作

首先,您需要在配置文件中输入NameVirtualHost ip:443! 你可能有一个80结尾,但你也需要一个443结尾

其次,您需要一个*.domain证书(通配符)(可以创建一个)


第三,您只能在一个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 webmaster@domain_name.com
    DocumentRoot /var/www/html
    ServerName www.domain_name.com
    ErrorLog logs/www.domain_name.com-error_log
    CustomLog logs/www.domain_name.com-access_log common
</VirtualHost>
NameVirtualHost IP_地址:443
斯伦金安
SSLCertificateFile/etc/pki/tls/certs/ca.crt,其中“ca”是证书的名称
SSLCertificateKeyFile/etc/pki/tls/private/ca.key
服务器管理员webmaster@domain_name.com
DocumentRoot/var/www/html
服务器名www.domain\u name.com
错误日志/www.domain\u name.com-error\u日志
CustomLog logs/www.domain\u name.com-access\u log common

您必须在下面添加一部分,才能在给定IP上启用
NameVirtualHost
功能

NameVirtualHost IP_Address:443

哈罗德,谢谢你的回复。我之前试过了,没什么区别。大卫,谢谢你的回复。在做了一些研究之后,我相信这将是一条道路。但是,在Windows XP下对SNI的支持有限。我想我无论如何都会尝试,因为我使用的是通配符证书。如果这不起作用,我想我现在必须忽略这些错误。PS:大多数网站似乎将其称为服务器名称指示,而不是标识。啊,我的坏。。。我真的只记得缩写词SNI。我将编辑此帖子。您的一个端口号错误,我无法在6个字符分钟的编辑时间内修复它。请确保您使用正确的
通用名称生成证书,否则它将在某些浏览器中工作,而不是在IElook中工作,因为此答案有点过时。您完全正确,基于名称的SSL无法工作。很好的链接。我确保在httpd.conf中注释掉
#Include conf/extra/httpd ssl.conf
,然后这在httpd-vhosts.conf中起作用:
NameVirtualHost*:443(linebreak)监听443(linebreak)(linebreak)SSLEngine On(linebreak).
NameVirtualHost IP_Address:443