--- tags: 日誌 --- # apache2 配置完 SSL 憑證後出現 SSL routines:ssl3_get_record:wrong version number 的錯誤 DEBUG 紀錄 ## 背景: 我有一台 ubuntu18.04 的主機,我在上面裝了一個 apache2.4。 然後我現在有兩個已經開發好的網站和兩個 domain,DNS 也已經設定好讓他們指向到這個 IP。 然後我希望: 別人用 b.com 訪問會 access /var/www/html2 的內容,然後對於其他情況(例如用 a.com、用 IP 訪問),他會 access 到 /var/www/html1。 然後如果用 a.com 或是 b.com 連進來,必須要有 https。 ## 步驟: 我用 letsencrypt 幫我生了兩張證書,分別給那兩個 domain name。然後我在 apache2/sites-available/000-default.conf 裡面設定: ``` <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html RewriteEngine On ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html RewriteEngine On ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <VirtualHost> ``` 然後做完在 80 port 的基本設定後,再讓 certbot 直接幫我做完全套: ``` <VirtualHost *:80> ServerName a.com ServerAlias www.a.com DocumentRoot "/var/www/html1" RewriteEngine on </VirtualHost> <VirtualHost *:443> ServerName a.com ServerAlias www.a.com DocumentRoot "/var/www/html1" Include /etc/letsencrypt/options-ssl-apache.conf SSLCACertificateFile CA 憑證位置 SSLCertificateFile 憑證位置 SSLCertificateKeyFile 私鑰位置 </VirtualHost> ``` b.com 也是類似的設定。 ## 問題: Chrome 噴了一個 err_ssl_protocol_error,然後看一下錯誤訊息,是 ssl routines:ssl3_get_record:wrong version number,查了一下,不外乎 443 沒開、NAT 沒設好之類的問題。 後來發現真正的原因是我在 000-default.conf 裡面設定了一個沒有指定 ServerName 也沒有針對 SSL 做設定的 VirtualHost *:443,導致發 HTTPS 請求過去的時候他因為 SSLEngine 沒開,沒辦法回應。 我想我對 apache 對於 virtualhost 的優先度政策不夠清楚@@,因為我以為是會依照最早解析到且 match 到有 ServerName 的 virtualhost,但按照這個情況來講,好像他沒有說一定要有 ServerName,只要出現的早就好。但如果這樣,為何我用 http://b.com,出現的仍然會被轉到 https://b.com 的內容呢?(我做過 Rewrite,但是是在 ServerName 為 b.com 的地方做)。 後來才發現自己會錯意了,apache 2.4 的 virtual host 優先度政策大概是這樣: 1. 先看 ip:port - 先匹配精確的 ip:port,如果有就到 2 - 再匹配有 wildcard 的 ip:port,如果有就到 2 - 否則由 default 處理 2. 再看 ServerName - 如果 request 是 https,優先交給支援 SSL 的 virtualhost。 - 如果有多個 match 到 ServerName 的,就依照他們出現的順序,最早出現的排序最高。 ### 解決方法: 把 000-default.conf 砍了。 ### 引用: https://httpd.apache.org/docs/2.4/vhosts/details.html