![使用 SNI 和混合 SSL 证书的 Apache 配置](https://linux22.com/image/676155/%E4%BD%BF%E7%94%A8%20SNI%20%E5%92%8C%E6%B7%B7%E5%90%88%20SSL%20%E8%AF%81%E4%B9%A6%E7%9A%84%20Apache%20%E9%85%8D%E7%BD%AE.png)
到目前为止,我一直在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 是第一个,它将匹配这些请求,并可能导致证书错误。