我使用的是 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
。我推测您还需要从 更改http
为https
。
我将针对不同的域使用不同的文件(以下层次结构适用于 Ubuntu,在 RHEL/CentOS 中我使用vhosts.d
):
$ ls -1 sites-available/
domain1.net.conf
domain2.net.conf
我使用与以下类似的方法重定向http
到https
。
<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 的条目,则需要添加它。否则,不需要。