Apache-2.2

使用 SNI 和混合 SSL 證書的 Apache 配置

  • February 6, 2016

到目前為止,我一直在使用ssl.confApache 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)。如果相關,我也會在伺服器啟動時收到此警告:

$$ warn $$RSA 伺服器證書萬用字元 CommonName (CN) `*.newdomain.com’ 與伺服器名稱不匹配!?

如果我將 ServerName 更改為*.newdomain.com,我不會收到警告,但證書根本不起作用。

我很確定您必須提供實際的 ServerName 而不是萬用字元。

您的新證書只有“*.newdomain.com”還是“newdomain.com”?我猜只是第一個,所以只能用於子域而不是頂級域(TLD)。在這種情況下,只需將 ServerName 設置為 www.newdomain.com 或萬用字元將匹配的任何其他 ServerName。不過,擁有一個也涵蓋裸 TLD 的證書是一種很好的做法。

您還應該將 newdomain 伺服器配置移到第一位。這樣,它將成為預設值,任何未明確匹配的內容都將落入此處(例如,如果有人使用 ransom.newdomain.com)。目前,由於 www.domain1.com 是第一個,它將匹配這些請求並可能導致證書錯誤。

引用自:https://serverfault.com/questions/753620