Chrome强制需要spnego在401之后使用http1.1而不是h2

时间:2019-01-08 13:25:48

标签: google-chrome nginx single-sign-on http2 spnego

我将nginx + spnego模块配置为通过sso在特定地址登录用户,并注意到chrome会在整个子域中强制使用http / 1.1。没有SSO,整个站点都将使用http / 2。 Nginx是(1.15.0),来自github的spnego模块和当前的Chrome(v71)。

我在nginx中打开了调试信息,并且有:

2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL ALPN supported by client: h2
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL ALPN supported by client: http/1.1
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL ALPN selected: h2
2019/01/07 14:39:11 [debug] 42132#42132: *2379 SSL ALPN supported by client: h2
2019/01/07 14:39:11 [debug] 42132#42132: *2379 SSL ALPN supported by client: http/1.1
2019/01/07 14:39:11 [debug] 42132#42132: *2379 SSL ALPN selected: h2
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL_do_handshake: -1
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL_get_error: 2
2019/01/07 14:39:11 [debug] 42129#42129: *2378 reusable connection: 0
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL handshake handler: 0
2019/01/07 14:39:11 [debug] 42129#42129: *2378 ssl new session: 057AF550:32:184
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL_do_handshake: 1
2019/01/07 14:39:11 [debug] 42129#42129: *2378 SSL: TLSv1.2, cipher: "ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD"
2019/01/07 14:39:11 [debug] 42129#42129: *2378 init http2 connection

在这个阶段还可以-它是http2,但是模块发送401代码并要求提供凭据:

2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 header filter
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 push resources
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: ":status: 401"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "server: nginx"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "date: Mon, 07 Jan 2019 13:41:05 GMT"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "content-type: text/html; charset=utf-8"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "content-length: 590"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "www-authenticate: Negotiate"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 output header: "strict-transport-security: max-age=63072000; includeSubDomains; preload"
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2:5 create HEADERS frame 000055B593338C60: len:133 fin:0
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http cleanup add: 000055B593338D58
2019/01/07 14:41:05 [debug] 42129#42129: *2378 http2 frame out: 000055B593338C60 sid:5 bl:1 len:133

到目前为止,h2似乎工作正常,之后chrome仅发送http 1.1 alpn响应401页面:

2019/01/07 14:41:05 [debug] 42129#42129: *2378 reusable connection: 1
2019/01/07 14:41:05 [debug] 42129#42129: *2378 event timer del: 53: 8023593525
2019/01/07 14:41:05 [debug] 42129#42129: *2378 event timer add: 53: 180000:8023706453
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL ALPN supported by client: http/1.1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL ALPN selected: http/1.1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL_do_handshake: -1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL_get_error: 2
2019/01/07 14:41:05 [debug] 42129#42129: *4179 reusable connection: 0
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL handshake handler: 0
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL_do_handshake: 1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL: TLSv1.2, cipher: "ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD"
2019/01/07 14:41:05 [debug] 42129#42129: *4179 SSL reused session
2019/01/07 14:41:05 [debug] 42129#42129: *4179 reusable connection: 1
2019/01/07 14:41:05 [debug] 42129#42129: *4179 http wait request handler

之后,整个域的所有内容都将位于http / 1中。我在nginx中配置了通配符服务器,并进行了多次测试-直到auth h2和auth http1之后。现在,我将auth端点移动到另一个子域,因此chrome不会强制应用程序使用http1,但我仍在寻求解决。 我检查了ssl,cert,密码-在http / 1和http / 2上没有更改,并且它不是任何防病毒软件。 另外,我无法在登录后清除该状态和FORCE http / 2,唯一有用的是杀死chrome进程。清除应用程序缓存无济于事。

它可以在IE和EDGE中使用。 Firefox默认情况下不支持SSO和策略。

如何强制Chrome将http / 2用于域?如果无法在身份验证页面上执行此操作,如何将其强制到除一个URL之外的其他页面上? 任何人都知道如何强制chrome重新协商开发工具中的http / 2。 我也找不到关于从http / 2切换到v1

的chrome中的任何日志和错误

1 个答案:

答案 0 :(得分:0)

这是Chrome中的已知错误。 Chrome不支持通过HTTP / 2进行SSO,但不支持某些HTTP / 1和与同一个域的HTTP / 2连接,因此产生了影响。

在此处查看错误https://bugs.chromium.org/p/chromium/issues/detail?id=832586

尤其是底部的评论

  

问题的根源在于网络堆栈当前   不支持并发HTTP / 1.1和HTTP / 2连接到同一   服务器。有关此问题的信息,请参见问题685741评论10和11   可能性。