最近上网看到一些消息,说是Google要在Chrome51全面禁用SPDY协义下的NPN,转而使用ALPN.

TL;DR: Support for HTTP/2 is widespread enough that SPDY/3.1 support can be dropped.
TL;DR: As part of deprecation of SPDY, NPN is removed, having previously been replaced with ALPN.

原文请戳这里
也就是说如果你的网站开启了HTTP/2协议,但是服务器不支持ALPN的话会协商失败降级到HTTP/1.1。
再加上Chrome要在将来对不支持HTTPS的网站进行图标警告,让我有了给自己服务器配置上HTTPS+HTTP/2(ALPN)的想法
本文主要介绍Nginx如何开启HTTP2,省去了HTTPS配置的步骤。

准备工作

首先得准备OpenSSL 1.0.2以上的版本。笔者用的Centos7服务器yum到最新也只有1.0.1e,只能自己去openssl官网上下载。
只有1.0.2以上的版本才能支持ALPN。

$ wget https://www.openssl.org/source/openssl-1.1.0c.tar.gz
$ tar zxf openssl*

升级Nginx

如果你是从零开始安装Nginx,过程大同小异。
刚刚准备好的openssl不用安装,直接把source目录给nginx配置参数。

$ wget http://nginx.org/download/nginx-1.10.2.tar.gz
$ tar zxf nginx*
$ cd nginx*
$ ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-openssl=/usr/src/openssl-1.1.0c --with-http_gzip_static_module --with-ipv6  --with-http_v2_module
$ make
$ nginx -s stop
$ cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
$ cp ./objs/nginx /usr/local/nginx/sbin/nginx
$ nginx

开启HTTP2

因为我们在配置参数里指定了--with-http_v2_module所以开启HTTP2也简单。
只要在配置文件listen后面加上http2就可以了。

server {
...
  listen 443 ssl http2
...
}

额外的安全配置

加强Diffie–Hellman共有key

默认的Diffie–Hellman密钥长度有点短,不是太安全。我们需要自己建一个2048长度的密钥。

$ openssl dhparam -out dhparams.pem 2048

时间稍长,请耐心等待。
完成之后我们修改nginx配置文件,在server那段中间加上

ssl_dhparam /usr/local/nginx/keys/dhparams.pem

把路径换成你自己的。

前方隐匿性

【前方隐匿性】是指私有key万一被盗之后我们的通信内容也不能被还原这一性质。
是通过ssl_ciphers来设定的。
编辑nginx配置文件,在server段里加上

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-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:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;

ssl_ciphers设定的是“使用/不使用某个(加密组合)加密方式”。
ssl_prefer_server_ciphers设定的是“优先使用服务器指定的加密方式进行加密”

最后修改:2016 年 12 月 06 日 10 : 44 PM
如果觉得我的文章对你有用,请随意赞赏