Nginx主线新版本在11月2号又更新了,看了下这次的更新日志 其中第一个Change是,http2中,移除了NPN,目前HTTP/2只支持ALPN了,我们今天来说下什么是NPN与ALPN? 比NPN少了一个交互的步骤,所以ALPN是推荐的协议 所以,使用ALPN相对于NPN来说,在SSL/TLS交互握手的过程中,减少了一个TTL来回,性能相对有一定的提升 ALPN如何交互? Extension Length: 12 ALPN Protocol ALPN string length: 2 ALPN Next Protocol Extension字段中,使用了ALPN,并且列出了可以选择使用的两种ALPN Protocol:h2和http/1.1 对应的“server hello” 消息会选择出具体使用的ALPN protocol Extension Length: 3 ALPN Protocol ALPN string length: 2 ALPN Next Protocol
本文基于nginx,对alpn的实现原理进行深入的分析。 2.2 通过抓包看一下alpn的细节 下面通过TLS v1.2握手协议来查看alpn的细节,对于TLS v1.3协议,在ServerHello响应的时候由于alpn部分的信息被加密,所以查看起来比较会麻烦 ->ssl.ctx, ngx_http_ssl_alpn_select, NULL); #endif 没错,最以上源码的最后部分,nginx向openssl底层库设置了alpn的回调函数ngx_http_ssl_alpn_select 3.3 处理alpn协议回调 在握手期间,ssl底层逻辑会解析ClientHello数据报文,发现有alpn数据后,就回调前面设置好的ngx_http_ssl_alpn_select函数了。 NGX_HTTP_ALPN_PROTOS; srvlen = sizeof(NGX_HTTP_V2_ALPN_PROTO NGX_HTTP_ALPN_PROTOS) - 1;
网络协议之:加密传输中的NPN和ALPN 文章目录 简介 SSL/TLS协议 NPN和ALPN 总结 简介 自从HTTP从1.1升级到了2,一切都变得不同了。 Extension Length: 12 ALPN Protocol ALPN string length: 2 ALPN Next Protocol Extension字段中,使用了ALPN,并且列出了可以选择使用的两种ALPN Protocol:h2和http/1.1。 Extension Length: 3 ALPN Protocol ALPN string length: 2 ALPN Next Protocol 总结 NPN和ALPN都是TLS的扩展,相较而言,ALPN更加好用。
Initialization of bean failed; nestedexception is java.lang.IllegalStateException: Could not find TLS ALPN provider; no working netty-tcnative, Conscrypt, or Jetty NPN/ALPN available at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: java.lang.IllegalStateException: Could not find TLS ALPN provider; no working netty-tcnative, Conscrypt, or Jetty NPN/ALPN available at io.grpc.netty.GrpcSslContexts.defaultSslProvider
网络协议之:加密传输中的NPN和ALPN 文章目录 简介 SSL/TLS协议 NPN和ALPN 总结 简介 自从HTTP从1.1升级到了2,一切都变得不同了。 Extension Length: 12 ALPN Protocol ALPN string length: 2 ALPN Next Protocol Extension字段中,使用了ALPN,并且列出了可以选择使用的两种ALPN Protocol:h2和http/1.1。 Extension Length: 3 ALPN Protocol ALPN string length: 2 ALPN Next Protocol 总结 NPN和ALPN都是TLS的扩展,相较而言,ALPN更加好用。 本文已收录于 http://www.flydean.com/08-ssl-tls-npn-alpn/
lnmp1.3中配置Nginx启用HTTP/2.0 + ALPN 作者:matrix 被围观: 4,323 次 发布时间:2017-04-17 分类:零零星星 | 无评论 » 这是一个创建于 服务器端OpenSSL库的版本要支持ALPN(1.0.2+ 目前最新为1.1.0e),之前是用SPDY,NPN,后来google只支持ALPN,也就是说未来就是HTTP/2 + ALPN 为什么我们应该尽快支持 ALPN?
TLS的扩展协议NPN和ALPN HTTP2协议是从spdy协议发展而来的,无论是spdy还是http2都为了能在HTTPS的环境下工作,发展出来了TLS协议的扩展。 其中ALPN可以在客户端首次和服务器端进行握手的时候,就列出客户端支持的应用层数据协议,服务器端直接选择即可,因此可以比NPN少一个交互流程,更加优秀。 它提供了一个isAlpnSupported方法,根据传入provider的不同来判断,是否支持ALPN。 也就是说如果是用JDK作为默认的SSL provider的话,它是不支持ALPN的。必须升级到java9. protocol是TLS的扩展协议,像ALPN或者NPN等。
TLS的扩展协议NPN和ALPN HTTP2协议是从spdy协议发展而来的,无论是spdy还是http2都为了能在HTTPS的环境下工作,发展出来了TLS协议的扩展。 其中ALPN可以在客户端首次和服务器端进行握手的时候,就列出客户端支持的应用层数据协议,服务器端直接选择即可,因此可以比NPN少一个交互流程,更加优秀。 它提供了一个isAlpnSupported方法,根据传入provider的不同来判断,是否支持ALPN。 也就是说如果是用JDK作为默认的SSL provider的话,它是不支持ALPN的。必须升级到java9. protocol是TLS的扩展协议,像ALPN或者NPN等。
rfc7540 如果要说 http/1.1 最大的改进,大概要算 长连接 吧,而 http/2 的改进则更多一点: 使用二进制传输,取代之前的文本传输 连接复用(多路复用),并行 协议握手改进(ALPN ) 重置(RST_STREAM) 优先级和依赖性 Header 压缩 服务器推 流量控制 另外,关于 ALPN 和 NPN 可以参考 https://zlb.me/2013/07/19/npn-and-alpn http://tools.ietf.org/html/rfc7301 http://caniuse.com/#feat=http2 https://zlb.me/2013/07/19/npn-and-alpn
. * TCP_NODELAY set * Connected to baidu.com (39.156.69.79) port 443 (#0) * ALPN, offering h2 * ALPN, (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN
. * Connected to s-api.37.com.cn (106.53.109.63) port 443 (#0) * ALPN: offers h2 * ALPN: offers http/ (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN 10.43.2.9/api/xxx' * Trying 10.43.2.9:443... * Connected to 10.43.2.9 (10.43.2.9) port 443 (#0) * ALPN : offers h2 * ALPN: offers http/1.1 * CAfile: /etc/ssl/cert.pem * CApath: none * (304) (OUT), TLS handshake
. * Connected to 127.0.0.1 (127.0.0.1) port 8443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * /127.0.0.1:8443/ * Trying 127.0.0.1:8443... * Connected to 127.0.0.1 (127.0.0.1) port 8443 (#0) * ALPN , offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: / 304) (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256 * ALPN
ALPN((Application Layer Protocol Negotiation)协议 ALPN (Application Layer Protocol Negotiation)是TLS的扩展 ALPN支持任意应用层协议的协商,目前应用最多是HTTP2的协商。当前主流浏览器,都只支持基于 HTTPS 部署的 HTTP/2,因为浏览器是基于ALPN协议来判断服务器是否支持HTTP2协议。 ALPN是TLS的扩展协议,而ALPN的作用就是告诉客户端,当前服务端支持的接口协议版本有哪些,当然这里会有很多种。所有上看的问题的答案基本呼之欲出,贴一张朋友吊打我的图。 Save the handshake and the ALPN protocol. // 成功之后,保存HandShake以及ALPN协议信息。 然后会通过Platform去从SSLSocket去获取ALPN的协议支持信息,当后端支持的协议内包含Http2.0时,则就会把请求升级到Http2.0阶段。
rfc7540 如果要说 http/1.1 最大的改进,大概要算 长连接 吧,而 http/2 的改进则更多一点: 使用二进制传输,取代之前的文本传输 连接复用(多路复用),并行 协议握手改进(ALPN ) 重置(RST_STREAM) 优先级和依赖性 Header 压缩 服务器推 流量控制 另外,关于 ALPN 和 NPN 可以参考 https://zlb.me/2013/07/19/npn-and-alpn http://tools.ietf.org/html/rfc7301 http://caniuse.com/#feat=http2 https://zlb.me/2013/07/19/npn-and-alpn
SPDY似乎是使用了NPN做协议头协商,但是新的标准化的应该使用ALPN。 但是按nginx的文档,ALPN只在openssl 1.0.2以上才支持。又然而CentOS自带的openssl版本是1.0.1。这就比较麻烦了,得自己重新编译nginx,否则没法开启ALPN。 最好在执行完lnmp_for_el7.sh后,在使用本脚本覆盖安装nginx,最好不要直接使用本脚本(直接使用的话我没有测试) # CentOS 7默认使用openssl 1.0.1,但是这个版本不支持ALPN en/docs/http/ngx_http_v2_module.html#issues # 但是nginx 1.10.0以后,只有HTTP/2模块,不再有spdy,并且除chrome外的浏览器都必须支持ALPN 我这里Firefox测试的时候还出了点小插曲,不知道那个鬼插件把我的安全设置里的security.tls.version.max设成1了,然后ALPN协商HTTP/2必须用TLSv1.2,然后一直Firefox
ALPN 扩展 HTTP/2 协议本身并没有要求它必须基于 HTTPS(TLS)部署,但是出于以下三个原因,实际使用中,HTTP/2 和 HTTPS 几乎都是捆绑在一起: HTTP 数据明文传输,数据很容易被中间节点窥视或篡改 随着 SPDY 被 HTTP/2 取代,NPN 也被官方修订为 ALPN(Application Layer Protocol Negotiation,应用层协议协商)。 可以看到,客户端在建立 TLS 连接的 Client Hello 握手中,通过 ALPN 扩展列出了自己支持的各种应用层协议。其中,HTTP/2 协议名称是 h2。 ? 如果服务端支持 HTTP/2,在 Server Hello 中指定 ALPN 的结果为 h2 就可以了;如果服务端不支持 HTTP/2,从客户端的 ALPN 列表中选一个自己支持的即可。 并不是所有 HTTP/2 客户端都支持 ALPN,理论上建立 TLS 连接后,依然可以再通过 HTTP Upgrade 进行协议升级,只是这样会额外引入一次往返。
containing SSL ciphers to use --ssl-servername Request distinct server name (SNI) --ssl-alpn ALPN protocol list to use --version Display Ncat's version information
HTTP/2.0 Over TLS版: 客户端向服务器端请求 TLS + ALPN(Application Layer Protocol Negotiation)/NPN 服务器端返回: TLS 握手 ALPN协商过程 参考TLS握手过程图,下面是增加ALPN协商的具体过程: 客户端添加一个ProtocolNameList字段,包含支持的HTTP协议到ClientHello消息中; 服务器端查看ProtocolNameList 字段后通过ServerHello消息返回ProtocolName字段,表明被选定的协议; 通过实现ALPN,不再需要单独请求一次服务器带上Upgrade: h2c。 False Start 通常情况下,使用ALPN会搭配使用False Start,客户端在完成TLS握手前提前发送加密后的应用数据,将两次RTT TLS握手减少为一次;不过需要同时支持ALPN(NPN已经很少用啦
其中,最流行的是Alpn-boot库,它可以在Java中启用对HTTP2的支持。使用隧道代理实现对HTTP2网站的高速访问在Java中,可以使用隧道代理来实现对HTTP2网站的高速访问。 下面是使用隧道代理的步骤:导入Alpn-boot库:首先,需要在Java项目中导入Alpn-boot库,以启用对HTTP2的支持。
此外,我们在此基础上还增加和完善了 "ALPN"(应用层协议协商)、"QUIC/TLS parallel monitoring"(QUIC/TLS并行监听)、"Alt-Svc"(备选服务) 等功能。 同时,我们也为 StreamConn设计了 ALPN 能力,以便于在 QUIC 内提供协议协商的能力。