AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 772901
Accepted
jarvis
jarvis
Asked: 2016-04-26 20:16:28 +0800 CST2016-04-26 20:16:28 +0800 CST 2016-04-26 20:16:28 +0800 CST

使用 HTTP/2 和 SAN SSL 的 421 错误定向请求

  • 772

我在 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>
ssl https amazon-web-services apache-2.4 ubuntu-14.04
  • 2 2 个回答
  • 5992 Views

2 个回答

  • Voted
  1. Best Answer
    jarvis
    2016-04-28T05:39:58+08:002016-04-28T05:39:58+08:00

    这对我来说是一个真正的问题。 但我在这里找到了答案。

    多个主机和错误定向的请求

    许多站点对多个虚拟主机使用相同的 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 上使用相同的配置后,问题得到修复。

    • 5
  2. Ranjan
    2017-04-20T09:40:30+08:002017-04-20T09:40:30+08:00

    我今天遇到了这个问题,起初有点困惑,因为我没有使用任何不同的密码等,所以我无法理解上面答案中的“如果你混合事物”注释的真正含义。好吧,事实证明,如果 SSLCertificateFile 和 SSLCertificateKeyFile 具有相同的内容并且文件甚至是彼此相同的副本是不够的。这些配置设置必须指向同一个文件!我怀疑这是因为它不是真正看到问题的浏览器(正如我最初认为的那样),而是 Apache 已经检测到配置不一样并预先阻止任何 HTTP2 请求,因为它期望浏览器的如果它真的传递了页面就会有问题(这很可能确实发生了)。Apache 还在其日志文件中写入了相应的错误(“通过 SNI 提供的主机名 www.example.com 和通过 HTTP 提供的主机名 www2.example.com 没有兼容的 SSL 设置”)。这个设置兼容性测试似乎相当简单,并不关心证书实际上是相同的事实。它可能只注意到不同的文件名/路径,然后犹豫不决。

    • 2

相关问题

  • 如何使用 Tomcat 5.5 更新 SSL 证书

  • 为 IIS6 自行生成 SSL 证书?

  • plesk 上的域和子域 ssl 访问

  • 如何设置 SSL 邮件服务器?

  • 如何通过 SVN 命令行接受 SSL 证书?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve