我在 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 [email protected]
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>
这对我来说是一个真正的问题。 但我在这里找到了答案。
多个主机和错误定向的请求
我有 3 个虚拟主机共享相同的证书。它们都是使用我的“默认”SSL 设置配置的。最后一个有特殊配置,因为我不需要最后一个来兼容很多浏览器,所以我使用了更现代的密码,只使用了最新的 SSL 协议。那个特别的“特殊”虚拟主机得到了 421。
如果我禁用协议 h2 http/1.1 可以解决问题,但我不想禁用它。
在所有共享相同证书的 VirtualHost 上使用相同的配置后,问题得到修复。
我今天遇到了这个问题,起初有点困惑,因为我没有使用任何不同的密码等,所以我无法理解上面答案中的“如果你混合事物”注释的真正含义。好吧,事实证明,如果 SSLCertificateFile 和 SSLCertificateKeyFile 具有相同的内容并且文件甚至是彼此相同的副本是不够的。这些配置设置必须指向同一个文件!我怀疑这是因为它不是真正看到问题的浏览器(正如我最初认为的那样),而是 Apache 已经检测到配置不一样并预先阻止任何 HTTP2 请求,因为它期望浏览器的如果它真的传递了页面就会有问题(这很可能确实发生了)。Apache 还在其日志文件中写入了相应的错误(“通过 SNI 提供的主机名 www.example.com 和通过 HTTP 提供的主机名 www2.example.com 没有兼容的 SSL 设置”)。这个设置兼容性测试似乎相当简单,并不关心证书实际上是相同的事实。它可能只注意到不同的文件名/路径,然后犹豫不决。