![哪个 apache VirtualHost 配置将通过 SSL 为一个且仅一个域提供服务?](https://linux22.com/image/647133/%E5%93%AA%E4%B8%AA%20apache%20VirtualHost%20%E9%85%8D%E7%BD%AE%E5%B0%86%E9%80%9A%E8%BF%87%20SSL%20%E4%B8%BA%E4%B8%80%E4%B8%AA%E4%B8%94%E4%BB%85%E4%B8%80%E4%B8%AA%E5%9F%9F%E6%8F%90%E4%BE%9B%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
我有多个域名(example1.com
、example2.com
、...
)托管在同一个 IP 上。其中一个域名(example3.com
)有 SSL 证书,我想通过 HTTPS 提供服务,同时让所有其他网站都使用 HTTP。到目前为止,我已经设置好了,并且运行正常。
我的问题是,对(注意 s)的请求由 apache 配置部分(以 开头)https://www.example1.com
处理,这会导致问题,因为这是一个 Django 网站,并且由于不在 Django 的设置中,它会生成 400 错误请求。example3.com
<VirtualHost *:443>
example1.com
ALLOWED_HOSTS
我理解 SSL 的本质意味着Host:
在建立安全连接之前无法知道标头。但是有没有办法让 Apache 拒绝任何通过 HTTPS 的请求不是为了example3.com
?
我原本希望使用ServerName
SSL Virtualhost 中的指令将该部分限制为仅命名的主机,但是仔细检查文档看来这只是基于名称的虚拟主机的情况。
编辑:我尝试添加一个捕获所有默认值作为第一部分,如下所示:
<VirtualHost *:443>
ServerName default.only
<Location />
Require all denied
</Location>
</VirtualHost>
这会导致以下错误:
[Thu Dec 04 10:31:27.922801 2014] [mpm_event:notice] [pid 10498:tid 3074255488] AH00491: caught SIGTERM, shutting down
[Thu Dec 04 10:31:29.928483 2014] [ssl:emerg] [pid 30518:tid 3074300544] AH02240: Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] ((null):0)
[Thu Dec 04 10:31:29.928551 2014] [ssl:emerg] [pid 30518:tid 3074300544] AH02312: Fatal error initialising mod_ssl, exiting.
答案1
您发布的错误表明您没有为您的域包含相关的必要 SSL 配置;对于您希望通过 SSL 访问的任何域/子域,您将需要在相关VirtualHost
域的配置中提供证书等的相关信息,例如:
<VirtualHost _default_:443>
DocumentRoot /var/www/html/example1.com
ServerName example1.com
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:HIGH:!aNULL:!MD5:!DSS
SSLHonorCipherOrder on
SSLCertificateFile /etc/pki/tls/certs/example1certificate.crt
SSLCertificateKeyFile /etc/pki/tls/private/example1privatekey.key
SSLCertificateChainFile /etc/pki/tls/certs/certificatechainfile.pem
SSLCACertificateFile /etc/pki/tls/certs/certificateauthority.pem
</VirtualHost>
然后,您将需要VirtualHost
为其余域创建适当的段,但在这些段中,您当然只会将监听端口配置为 80,而没有 SSL 配置选项,例如:
<VirtualHost _default_:80>
DocumentRoot /var/www/html/example2.com
ServerName example2.com
</VirtualHost>
希望这可以帮助!
PS,上述的配置SSLCipherSuite
和SSLProtocol
都很好——如果您愿意的话,您可以使用它们来节省研究其他可能配置的时间。
答案2
正如@Polosson 在评论中所说,您需要创建两个端口 443 虚拟主机才能实现这种安排。
您列出的第一个将是所有到达端口 443 的数据包——这是首先列出的隐含内容。当主机通过 ServerName 为 example3.com 时,将使用第二个。