使用 HTTP/2 和 SAN SSL 的 421 錯誤定向請求
我在 Ubuntu 上執行 Apache 2.4.20,並且配置了 SSL。我有一個SAN SSL 證書,並且www.example.com和www2.example.com共享同一個證書。
當我包含以下內容時,我收到421 Misdirected Request錯誤:
Protocols h2 h2c http/1.1 H2Upgrade on H2Direct H2WindowSize 128000
如果我刪除它們,網站會正常執行。
如果在同一瀏覽器上打開www.example.com和www2.example.com,我會收到錯誤消息。如果我先訪問www.example.com,它將正確載入。當我從該 SAN SSL 證書載入第二個站點時出現錯誤,例如www2.example.com。我先去哪個網站並不重要。它總是在第二個站點上以421 Misdirected Request響應。
我使用 HTTP/2 指令有什麼問題?(順便說一下,它們在 VirtualHost 中)
還是 HTTP/2 和 SAN SSL 實現存在問題?
如果重要的話,www.example.com 和 www2.example.com 都在 AWS 中託管的同一台伺服器上。
謝謝。
編輯:
我還嘗試了以下設置,結果相同。
Protocols h2 http/1.1 H2Direct H2WindowSize 128000
在 SSL 配置中
<IfModule mod_ssl.c> SSLRandomSeed startup builtin SSLRandomSeed startup file:/dev/urandom 512 SSLRandomSeed connect builtin SSLRandomSeed connect file:/dev/urandom 512 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000) SSLSessionCacheTimeout 300 SSLOpenSSLConfCmd DHParameters "/path/dhparams.pem" SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS SSLHonorCipherOrder on SSLCompression Off SSLSessionTickets Off SSLUseStapling On SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLStaplingCache shmcb:${APACHE_RUN_DIR}/ssl_stapling(32768) SSLProtocol all -SSLv3 SSLInsecureRenegotiation Off SSLStrictSNIVHostCheck Off </IfModule>
在虛擬主機中
<IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin mail@example.com ServerName www.example.com DocumentRoot /path/path Protocols h2 http/1.1 H2Direct on H2WindowSize 128000 SSLEngine on SSLCACertificateFile /path/cert.crt SSLCertificateFile /path/cert.crt SSLCertificateKeyFile /path/key.key SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" <Directory /path/path> AllowOverride None Require all granted </Directory> </VirtualHost> </IfModule>
這對我來說是一個真正的問題。 但我在這裡找到了答案。
多個主機和錯誤定向的請求
許多站點對多個虛擬主機使用相同的 TLS 證書。證書要麼具有萬用字元名稱,例如“*.example.org”,要麼帶有多個備用名稱。使用 HTTP/2 的瀏覽器將認識到這一點,並為此類主機重用已打開的連接。
雖然這對性能很有好處,但它是有代價的:這樣的虛擬主機需要在配置中更加小心。問題是您將對同一 TLS 連接上的多個主機發出多個請求。這使得重新談判變得不可能,因為 HTTP/2 標準禁止它。
因此,如果您有多個使用相同證書的虛擬主機並希望為它們使用 HTTP/2,則需要確保所有虛擬主機具有完全相同的 SSL 配置。您需要相同的協議、密碼和設置來進行客戶端驗證。
如果混合使用,Apache httpd 會檢測到它並向客戶端返回一個特殊的響應程式碼 421 Misdirected Request。
我有 3 個虛擬主機共享相同的證書。它們都是使用我的“預設”SSL 設置配置的。最後一個有特殊配置,因為我不需要最後一個來兼容很多瀏覽器,所以我使用了更現代的密碼,只使用了最新的 SSL 協議。那個特別的“特殊”虛擬主機得到了 421。
如果我禁用協議 h2 http/1.1 可以解決問題,但我不想禁用它。
在所有共享相同證書的 VirtualHost 上使用相同的配置後,問題得到修復。