Ssl
在缺少證書的情況下查看來自另一個域的證書是否正確?
我在 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 站點的訪問者將看到一個警告標誌,而不是其他站點。