Ssl

在缺少證書的情況下查看來自另一個域的證書是否正確?

  • July 4, 2018

我在 apache、site1、site2、site3 中定義了 3 個站點,對於 1 和 2,我從 Let’s encrypt 請求 ssl 證書並正常工作,但不適用於站點 3。問題是每當我訪問https://site3時,我總是會獲得證書從其他網站之一,我認為從第一個定義。

這是apache應該如何工作還是我的配置錯誤?不確定當我沒有定義證書時應該看到什麼,也許是一些“無證書”錯誤?!

/etc/httpd/conf/httpd.conf

# http site 1
<VirtualHost site1.com:80>
       DocumentRoot /var/www/html/site1.com
       ServerName site1.com
       <Directory "/var/www/html/site1.com">
               Require all granted
               DirectoryIndex index.html index.php
       </Directory>
</VirtualHost>


# http site 2
<VirtualHost site2.com:80>
       DocumentRoot /var/www/html/site2.com
       ServerName site2.com
       <Directory "/var/www/html/site2.com">
               Require all granted
               DirectoryIndex index.html index.php
       </Directory>
</VirtualHost>

# http site 3 (only one WITHOUT ANY SSL)
<VirtualHost site3.com:80>
       DocumentRoot /var/www/html/site3.com
       ServerName site3.com
       <Directory "/var/www/html/site3.com">
               Require all granted
               DirectoryIndex index.html index.php
       </Directory>
</VirtualHost>

Include /etc/httpd/conf/httpd-le-ssl.conf >>>>>>>

/etc/httpd/conf/httpd-le-ssl.conf

# SSL site 1
<IfModule mod_ssl.c>
<VirtualHost site1.com:443>
       DocumentRoot /var/www/html/site1.com
       ServerName site1.com
       <Directory "/var/www/html/site1.com">
               Require all granted
               DirectoryIndex index.html index.php
       </Directory>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.site1.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.site1.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site1.com/chain.pem
</VirtualHost>
</IfModule>

# SSL site 2
<IfModule mod_ssl.c>
<VirtualHost site2.com:443>
       DocumentRoot /var/www/html/site2.com
       ServerName site2.com
       <Directory "/var/www/html/site2.com">
               Require all granted
               DirectoryIndex index.html index.php
       </Directory>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.site2.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.site2.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site2.com/chain.pem
</VirtualHost>
</IfModule>

是的,這是正確的。您的瀏覽器打開與伺服器的連接並要求進行 TLS 協商。通過 SNI,提示什麼是想要的站點。Apache 沒有為此配置的證書,並且“隨機”選擇(實際上,選擇第一個配置的)連接證書。

只有在建立連接後,瀏覽器才能請求站點。

請注意,瀏覽器應通知使用者該證書對該站點無效。

這種駭人聽聞的方式實際上是一種駭客:當 SSL 誕生時,您必須為每個 SSL 站點專用一個 IP。引入 SNI 是為了允許更多 SSL(實際上是 TLS)站點共享一個 IP。您可以強制 apache 拒絕來自非 SNI 客戶端的連接,但不能強制它拒絕其他站點的連接。

在這些情況下,最好的辦法是為託管伺服器創建一個“備用”證書,帶有備用站點,並將其配置為第一個(如果您使用 debian,則為 000-default)。這樣,請求不存在的 tls 站點的訪問者將看到一個警告標誌,而不是其他站點。

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