我在Ubuntu上运行Apache 2.4.20,并configuration了SSL。 我有一个SAN SSL证书 , www.example.com和www2.example.com共享相同的证书。
包含以下内容时,我收到421错误的请求错误:
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错误的请求 ”作为响应。
我使用HTTP / 2指令有什么问题? (顺便说一句,他们在VirtualHost里)
或者是否存在HTTP / 2和SAN SSL实现的问题?
如果有关系,www.example.com和www2.example.com都位于AWS托pipe的同一台服务器上。
谢谢。
编辑:
我也尝试了下面的设置,结果相同。
Protocols h2 http/1.1 H2Direct H2WindowSize 128000
在SSLconfiguration中
<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>
在VirtualHost中
<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>
这对我来说是一个真正的问题。 但是我在 这里 find了答案 。
许多站点对多个虚拟主机使用相同的TLS证书。 该证书具有通配符名称,如“* .example.org”或携带多个备用名称。 使用HTTP / 2的浏览器会识别并重用已经打开的连接。
虽然这对于性能来说非常棒,但是它的价格却很高:这些虚拟主机在configuration上需要更多的关注。 问题是你将有多个请求在同一个TLS连接上的多个主机。 这使得重新协商变得不可能,面对HTTP / 2标准禁止它。
因此,如果您有多个使用相同证书的虚拟主机,并且希望为其使用HTTP / 2,则需要确保所有虚拟主机具有完全相同的SSLconfiguration。 您需要使用相同的协议,密码和设置进行客户端validation。
如果混合使用,Apache httpd将检测到它,并向客户端返回一个特殊的响应代码421错误的请求。
我有3个VirtualHosts共享相同的证书。 他们都使用我的“默认”SSL设置进行configuration。 最后一个有特殊的configuration,因为我不需要最后一个与许多浏览器兼容,所以我使用了更现代的密码,只有最新的SSL协议。 那个特殊的“特殊”VirtualHost获得了421。
如果我禁用协议H2 HTTP / 1.1,将解决问题,但我不想禁用。
在所有共享相同证书的VirtualHost上使用相同的configuration后,问题就解决了 。
我今天遇到这个问题,起初有点困惑,因为我没有使用任何不同的密码等,所以我不明白上面的答案中的“如果你混合的东西”注释是真的。 那么,事实certificate,如果SSLCertificateFile和SSLCertificateKeyFile具有相同的内容,并且如果这些文件甚至是相同的副本,那么这还不够。 这些configuration设置必须指向相同的文件! 我怀疑这是因为它不是浏览器实际上看到一个问题(正如我最初认为的那样),而是Apache已经检测到configuration不是相同的,并且先发制人地阻止任何HTTP2请求,因为它期望浏览器的如果它确实提供了页面(这可能确实会发生),会有问题。 Apache也正在为其日志文件(“通过SNI提供的主机名www.example.com和通过HTTP提供的主机名www2.example.com没有兼容的SSL设置”)写入相应的错误。 这种安装兼容性testing似乎相当简单,并不关心证书实际上是相同的事实。 它可能只是注意到不同的文件名/path,然后balks。