Ssl

使用 HTTP/2 和 SAN SSL 的 421 錯誤定向請求

  • April 19, 2017

我在 Ubuntu 上執行 Apache 2.4.20,並且配置了 SSL。我有一個SAN SSL 證書,並且www.example.comwww2.example.com共享同一個證書。

當我包含以下內容時,我收到421 Misdirected Request錯誤:

Protocols h2 h2c http/1.1
H2Upgrade on
H2Direct
H2WindowSize 128000

如果我刪除它們,網站會正常執行。

如果在同一瀏覽器上打開www.example.comwww2.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 上使用相同的配置後,問題得到修復

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