哪个 apache VirtualHost 配置将通过 SSL 为一个且仅一个域提供服务?

哪个 apache VirtualHost 配置将通过 SSL 为一个且仅一个域提供服务?

我有多个域名(example1.comexample2.com...)托管在同一个 IP 上。其中一个域名(example3.com)有 SSL 证书,我想通过 HTTPS 提供服务,同时让所有其他网站都使用 HTTP。到目前为止,我已经设置好了,并且运行正常。

我的问题是,对(注意 s)的请求由 apache 配置部分(以 开头)https://www.example1.com处理,这会导致问题,因为这是一个 Django 网站,并且由于不在 Django 的设置中,它会生成 400 错误请求。example3.com<VirtualHost *:443>example1.comALLOWED_HOSTS

我理解 SSL 的本质意味着Host:在建立安全连接之前无法知道标头。但是有没有办法让 Apache 拒绝任何通过 HTTPS 的请求不是为了example3.com

我原本希望使用ServerNameSSL 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,上述的配置SSLCipherSuiteSSLProtocol都很好——如果您愿意的话,您可以使用它们来节省研究其他可能配置的时间。

答案2

正如@Polosson 在评论中所说,您需要创建两个端口 443 虚拟主机才能实现这种安排。

您列出的第一个将是所有到达端口 443 的数据包——这是首先列出的隐含内容。当主机通过 ServerName 为 example3.com 时,将使用第二个。

相关内容