如何使用一个 IP 地址、单独的虚拟主机文件和 Cloudflare SSL 设置 Apache 来访问多个网站

如何使用一个 IP 地址、单独的虚拟主机文件和 Cloudflare SSL 设置 Apache 来访问多个网站

我使用的是 ubuntu 16 LAMP 堆栈。我目前为每个域设置了虚拟主机文件,其中 cloudflare dns 指向相同的 IP2 个 Wordpress 网站。

我正在使用 cloudflare 生成一个由 Cloudflare 签名的免费 TLS 证书,以便在每个域的服务器上安装。

主机文件如下所示

域1.conf

<VirtualHost *:443>
    ServerAdmin [email protected]
    ServerName domain1.net
    ServerAlias www.domain1.net
    DocumentRoot /var/www/html/domain1
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine      on
    SSLCertificateFile      /etc/ssl/certs/domain1.crt
    SSLCertificateKeyFile   /etc/ssl/private/domain1.key
</VirtualHost>

域2.conf

<VirtualHost ip:443>
    ServerAdmin [email protected]
    ServerName domain2.net
    ServerAlias www.domain2.net
    DocumentRoot /var/www/html/domain2
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine      on
    SSLCertificateFile      /etc/ssl/certs/domain2.crt
    SSLCertificateKeyFile   /etc/ssl/private/domain2.key
</VirtualHost>

我的证书和密钥文件不是 .pem 文件,这有关系吗?

我需要编辑 ports.conf 文件吗?通过阅读另一条建议,我添加了前两行。

NameVirtualHost *:80

NameVirtualHost *:443

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

答案1

您正在讨论 SSL (默认443),但在您的示例中,您使用了80。我推测您还需要从 更改httphttps

我将针对不同的域使用不同的文件(以下层次结构适用于 Ubuntu,在 RHEL/CentOS 中我使用vhosts.d):

$ ls -1 sites-available/
domain1.net.conf
domain2.net.conf

我使用与以下类似的方法重定向httphttps

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName domain1.net 

        RedirectMatch 301 ^(.*)$ https://domain1.net$1
</VirtualHost>

<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerAdmin [email protected]
        ServerName domain1.net
        ServerAlias *.domain1.net
        ServerSignature Off

        SSLEngine On
        SSLCertificateFile /your/path/to/fullchain.pem
        SSLCertificateKeyFile /your/path/to/privkey.pem
        SSLCertificateChainFile /your/path/to/chain.pem

        # LogLevel debug ssl:debug rewrite:trace8
        # LogLevel info ssl:warn rewrite:trace8
        LogLevel info

        ErrorLog ${APACHE_LOG_DIR}/domain1.net.error.log
        CustomLog ${APACHE_LOG_DIR}/domain1.net.access.log combined

</VirtualHost>

是的,您需要启用 SSL。如果您对所有域使用相同的证书,请确保使用以下方式获取证书主题备用名称 ^1/ SNI 与您的所有域一样。此外,如果您使用 IP 而不是 DN 调用您的服务,则需要此字段。否则,如果您的调用使用 DN 而不是 IP,则不需要指定的字段。

更新:文件扩展名无关紧要。内容很重要。但是,出于维护原因,最佳做法是根据文件的内容保留扩展名约定。有关证书转换的更多信息^2

更新:在 SNI 和 SAN 之间进行选择^3(另见@戴夫评论),请选择您要使用 1 个证书还是多个证书。结果是更新证书的过程。如果证书来自不同的客户,有时是不可能的。

答案2

如果您拥有不同的域名,则需要不同的证书,每个域名一个。为了实现这一点,您需要服务器名称指示 (SNI)。请参阅这里

答案3

我的证书和密钥文件不是 .pem 文件,这有关系吗?

这取决于你的意思.pem文件。如果你指的是文件内容是 Base-64 编码的 DER,那确实很重要。从mod_ssl 文档

该指令指向一个包含 PEM 格式的证书数据的文件。

如果.pem你只是意味着扩展不是.pem,而内容Base-64 编码的 DER,您会没事的 - 只有微软关心文件扩展名。

如果它们的格式错误,您就会知道,因为 Apache 将拒绝启动。


我需要编辑我的 ports.conf 文件吗?

如果您ports.conf没有端口 443 的条目,则需要添加它。否则,不需要。

相关内容