@babydragon
2016-05-23T16:17:40.000000Z
字数 1083
阅读 2018
chrome
早在去年8月,Chromium项目已经决定开始废弃的NPN协商协议(一个传输层安全协议扩展协议)。即将在5月31日发布的Chrome 51稳定版本中,NPN协商协议将被正式废除,仅支持ALPN协商协议。也就是说,所有目前基于NPN协商协议的HTTP/2协议都将无法使用,并被降级到HTTP/1.1。
这对于客户端来说没有太大影响,但是对于希望使用HTTP/2协议的服务端,将NPN升级到ALPN,并不是一件容易的事情,OpenSSL至少需要升级到1.0.2版本才可以支持ALPN。
下表是常见服务器操作系统版本中自带的OpenSSL版本:
操作系统 | OpenSSL版本 |
---|---|
CentOS 5 | 0.9.8e |
CentOS 6 | 1.0.1e |
CentOS 7 | 1.0.1e |
Ubuntu 14.04 LTS | 1.0.1f |
Ubuntu 16.04 LTS | 1.0.2g |
Debian 7 (Wheezy) | 1.0.1e |
Debian 8 (Jessie) | 1.0.1k |
从上表可以看出,目前常用的服务器版本中,默认OpenSSL为1.0.2的只有Ubuntu 16.04 LTS。其他版本如果要升级OpenSSL版本,成本非常高,因为有很多包依赖OpenSSL,这些包都需要重新打包并进行测试。另一方面,OpenSSL 1.0.1的支持到2016年12月31日就将结束。
在一个传统搭建LAMP(Linux、Apache、MySQL、PHP)服务器上,通常会依赖OpenSSL库的软件有:
$ lsof | grep libssl | awk '{print $1}' | sort | uniq
anvil
fail2ban
gdbus
gmain
httpd
postfix
mysqld
NetworkManager
nginx
php-fpm
puppet
sshd
sudo
tuned
zabbix_agent
也就是说,如果系统的OpenSSL版本升级,这些包都需要重新打包,如果有API不兼容的地方,升级成本将会更高。
在Chrome 51稳定版之前,以下示例的协商结果会使用HTTP/2协议:
coolex ~ # nghttp -v -n https://ma.ttias.be
[ 0.252] Connected
[ 0.507][NPN] server offers:
* h2
* http/1.1
The negotiated protocol: h2
但是升级之后,由于NPN协商逻辑已经废弃,Chrome将无法协商获取服务器支持HTTP/2协议,进而降级成HTTP/1.1协议。
对于该问题,目前来看最简单的方式,是将应用运行到诸如Docker等的容器中。