使用 SNI 和混合 SSL 证书的 Apache 配置

使用 SNI 和混合 SSL 证书的 Apache 配置

到目前为止,我一直在ssl.conf使用 Apache 2.2.31 在我的文件中使用 SNI,我在同一个文档根目录中提供不同的网站。例如:

NameVirtualHost *:443

<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName www.domain1.com

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite ...
SSLHonorCipherOrder on

SSLCertificateFile /etc/pki/tls/certs/domain1.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/domain1.com.key
SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle_domain1.crt
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName www.domain2.com

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite ...
SSLHonorCipherOrder on

SSLCertificateFile /etc/pki/tls/certs/domain2.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/domain2.com.key
SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle_domain2.crt
</VirtualHost>

...

现在我添加了一个通配符证书,希望能够将子域添加到另一个新域而无需任何额外的 Apache 配置。因此 ssl.conf 如下所示:

NameVirtualHost *:443

<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName www.domain1.com

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite ...
SSLHonorCipherOrder on

SSLCertificateFile /etc/pki/tls/certs/domain1.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/domain1.com.key
SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle_domain1.crt
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName www.domain2.com

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite ...
SSLHonorCipherOrder on

SSLCertificateFile /etc/pki/tls/certs/domain2.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/domain2.com.key
SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle_domain2.crt
</VirtualHost>

...

<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName newdomain.com

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite ...
SSLHonorCipherOrder on

SSLCertificateFile /etc/pki/tls/certs/newdomain_wildcard.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/newdomain_wildcard.com.key
SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle_newdomain_wildcard.crt
</VirtualHost>

它适用于 newdomain.com,但不适用于其他子域(即 test.newdomain.com)。如果相关的话,我在服务器启动时也会收到此警告:

[警告] RSA 服务器证书通配符 CommonName (CN) `*.newdomain.com' 与服务器名称不匹配!?

如果我将 ServerName 更改为*.newdomain.com,我不会收到警告,但证书根本不起作用。

答案1

我很确定你必须提供一个实际的 ServerName,而不是通配符。

您的新证书是否只有“*.newdomain.com”或还有“newdomain.com”?我猜只有第一个,所以只能用于子域而不是顶级域 (TLD)。在这种情况下,只需将 ServerName 设置为 www.newdomain.com,或通配符将匹配的任何其他 ServerName。不过,拥有一个也涵盖裸 TLD 的证书是一种很好的做法。

您还应该将 newdomain 服务器配置移至第一个。这样它将成为默认配置,任何未明确匹配的内容都将落在此处(例如,如果有人使用 ransom.newdomain.com)。目前,由于 www.domain1.com 是第一个,它将匹配这些请求,并可能导致证书错误。

相关内容