我用jetty通过SSL启用了HTTP/2连接器.当我尝试连接浏览器时,出现"ERR_SSL_PROTOCOL_ERROR"错误.如果我切换到HTTP/1.1连接器一切正常.
这是我的码头配置文件:
<!-- ============================================================= -->
<!-- Configure the Jetty Server instance with an ID "Server" -->
<!-- by adding a HTTP connector. -->
<!-- This configuration must be used in conjunction with jetty.xml -->
<!-- ============================================================= -->
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
<Set name="secureScheme">https</Set>
<Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
<Set name="outputBufferSize">32768</Set>
<Set name="requestHeaderSize">8192</Set>
<Set name="responseHeaderSize">8192</Set>
<Set name="sendServerVersion">true</Set>
<Set name="sendDateHeader">false</Set>
<Set name="headerCacheSize">512</Set>
<!-- Uncomment to enable handling of X-Forwarded- style headers
<Call name="addCustomizer">
<Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
</Call>
-->
</New>
<!-- =========================================================== …Run Code Online (Sandbox Code Playgroud) 在HTTP/1中,为了避免额外的网络请求来确定资源是否应该保持缓存,我们将在静态资产上设置一个高值max-age或Expires值,并为每个版本提供一个唯一的URL.但是在HTTP/2中,请求很便宜,所以我们可以在没有缓存破坏的情况下完成,只需依赖ETag,最后修改,等等?
我可以看到继续破坏缓存(除了双重服务HTTP/1和HTTP/2客户端)的唯一优势是在资源过期时节省带宽检查.甚至那可能与HPACK无关.我错过了什么,或者我现在可以阻止缓存破坏吗?
在我的网络服务器上,我试图让H2(http2)工作.通过"ondrej"存储库安装Apache 2.4.20.我在Debian 8和Ubuntu 14.04服务器上测试过,但是我一直遇到同样的问题.我有OpenSSL 1.0.2和SSL vhosts运行.
奇怪的是发送升级头(连接:升级和升级:h2).当我做一些外部服务器测试时,我得到了响应,即在ALPN支持下h2正常运行.但问题是我测试的浏览器(Win7上的Chrome和FireFox)不会升级到H2.
我注意到缺少的一件事是HTTP2-Settings标头,但我在任何Apache文档中都找不到任何实现此功能或强制Apache发送此标头的内容.
遗憾的是我无法使用cUrl进行测试,因为我可以访问的服务器不支持任何具有http2支持的版本.
我的SSL vhost设置:
Protocols h2 http/1.1
SSLEngine On
SSLCACertificateFile xxxxxxxx
SSLProtocol all -SSLv2 -SSLv3
SSLCompression Off
SSLHonorCipherOrder On
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RSA+AES RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !AES128"
Header always set Strict-Transport-Security "max-age=15552000;includeSubDomains"
SSLCertificateFile xxxxxxxx
SSLCertificateKeyFile xxxxxxxx
Run Code Online (Sandbox Code Playgroud)
我正在使用prefork模块运行Apache而不是使用worker.
谁能告诉我什么是错的?
我是 nginx 的新手(过去一直在使用 apache)。
目前我正在尝试设置一个缓存,该缓存将位于 apache 后端,最终我认为(基于我迄今为止对 nginx 的良好经验)我们将切换到只使用 nginx。
一旦我打开 http2 Safari 就无法得到响应。在错误日志中没有任何表明有问题的内容,如果我打开访问日志并检查那里,我可以看到 Safari 客户端进行了很多很多连接,就像它只是不断刷新页面一样。
我已经尝试了许多 nginx 版本,因为我注意到最新的稳定版可能存在问题。所以我尝试降级到 1.9.14 以及升级到 1.11.1,但都没有运气。
Nginx 只编译:
./configure --with-http_ssl_module --with-http_v2_module
Nginx -V 输出:
nginx version: nginx/1.11.1
built by gcc 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1)
built with OpenSSL 1.0.2g-fips 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-http_ssl_module --with-http_v2_module
Run Code Online (Sandbox Code Playgroud)
我的配置看起来像这样(我的站点可用配置):
upstream backend {
server 127.0.0.1:8088 weight=100;
}
server {
listen 443 ssl http2 deferred;
server_name www.server.name;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK";
ssl_prefer_server_ciphers on; …Run Code Online (Sandbox Code Playgroud) 我试图了解HTTP/2协议压缩数据字段的方式.我没有在rfc中找到算法.我知道它是一个二进制协议.我正在寻找一种方法将二进制协议恢复为人类可读的内容.我认为这是gzip像在标题中写,但它不是任何人有一个源,我可以寻找二进制协议参考?
Frame 55: 151 bytes on wire (1208 bits), 151 bytes captured (1208 bits) on interface 0
Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst:00:00:00_00:00:00 (00:00:00:00:00:00)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443 (443), Dst Port: 55300 (55300), Seq: 1087, Ack: 1078, Len: 85
Secure Sockets Layer
HyperText Transfer Protocol 2
Stream: HEADERS, Stream ID: 13, Length 47
Length: 47
Type: HEADERS (1)
Flags: 0x04
0... .... .... .... .... .... .... .... = Reserved: …Run Code Online (Sandbox Code Playgroud) 我正在尝试详细了解HTTP/2.我读了这篇关于流,消息和框架的文章:https://hpbn.co/http2/#streams-messages-and-frames.我不知道我的概念是否正确.
我得出以下结论:
此外:规范中如何表示消息?
Java 9导入一个新的HTTP/2客户端API,它似乎很好用,但有没有办法在Java 8中使用它?
要么
是否有任何shim/ polyfill(来自javascript)可以在Java 8中使用它?
继HTTP“主机”标头参数中是否需要端口号?,同样的逻辑是否适用于 HTTP/2?
即如果浏览器向https://server.com:1234/发出请求,:authority标题应该是server.com还是server.com:1234?
我读到 Express 4.x 与 Node.js 原生 HTTP2(从 8.4+ 开始)不兼容,我希望 Express 5.x 上的进展比它更多。但是当我开始考虑 Express5.x 可能会在我的下一个 Node.js 项目中发布的很晚时 - 我来到了 Nest.js。
有谁知道 Nest.js 是否可以与原生 HTTP2 支持一起使用?
我听说过的唯一支持此功能的 Node.js 框架是 Fastify。或者还有其他的吗?最好是支持 Express 插件的。
我有一个 Go 服务器处理 https 请求:
package main
import (
"fmt"
"net/http"
"log"
)
const (
port = "5966"
cert = "/tmp/cert.pem"
key = "/tmp/key.pem"
)
func main() {
listen_at := ":" + port
fmt.Println("Listening at", listen_at)
go http.HandleFunc("/job_handler/", job_handler)
log.Fatal(http.ListenAndServeTLS(listen_at, cert, key, nil))
}
func job_handler(w http.ResponseWriter, r *http.Request) {
// do somework
}
Run Code Online (Sandbox Code Playgroud)
原来在 https 模式下,Go 对 HTTP/2 协议有透明的支持。我们有一些客户端在 HTTP/2 中的行为明显异常,因此我们需要在服务器端禁用 HTTP/2。
不幸的是,我不能使用 ENV 变量GODEBUG=http2server=0来禁用 HTTP/2。剩下的内容Server.TLSNextProto如此处所述。
如何Server.TLSNextProto在上面的服务器代码上使用禁用 https/2?