前提条件,Nginx 已经配置好 SSL 的 HTTP/1 访问。
至于为何要使用 HTTP/2,我便不讨论了,可以参见文后给出的参与链接。
升级 Nginx 版本
当前(2016-02-26) nginx Stable version 最新为 1.8.1
,Mainline version 最新为 1.9.12
,我们需要使用 1.9.5+
版本才能支持 HTTP/2 的配置访问。可以通过 nginx -v
查看系统中安装的 Nginx 版本,因为我的 Nginx 版本过低,所以我们先升级当前的 Nginx 版本。
修改 /etc/yum.repos.d/nginx.repo
的 nginx 仓库地址为 mainline 的版本
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
CentOS 系统通过 yum clean all && yum update nginx
升级 Nginx 版本。
配置 Nginx HTTP/2 支持
找到 nignx 的配置文件,并修改。
[root@ixiaozhi local]# whereis nginx
nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx
我服务器里的 nginx 配置文件位于 /etc/nginx/conf.d/default.conf
,找到 Server 节点,并修改。
server {
listen 443 ssl http2; #增加 HTTP2
server_name www.ixiaozhi.com;
ssl_certificate /etc/nginx/ixiaozhi.com.crt;
ssl_certificate_key /etc/nginx/ixiaozhi.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
... ...
这时候,重启 Nginx 服务器 service nginx restart
,浏览器无法访问,且 Chrome 会报 “ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY” 错误。
通过资料查阅,HTTP/2 协议中对 TLS 有了更严格的限制:例如 HTTP/2 中只能使用 TLSv1.2+,还禁用了几百种 CipherSuite(详见:TLS 1.2 Cipher Suite Black List)。至此可以肯定,之所以出现这个错误,要么是服务端没有启用 TLSv1.2,要么是 CipherSuite 配置有问题。
因此我们上面的文件需要继续修改:
- 添加 ssl_protocols 支持 TLSv1.2
- 修改 ssl_ciphers ,我使用的是 Mozilla 推荐的 CipherSuite 配置,参见 Mozilla 推荐配置
改后的文件:
server {
listen 443 ssl http2; #增加 HTTP2
server_name www.ixiaozhi.com;
ssl_certificate /etc/nginx/ixiaozhi.com.crt;
ssl_certificate_key /etc/nginx/ixiaozhi.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS; # 修改 CipherSuite 协议
ssl_prefer_server_ciphers on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; # 增加 TLSv1.2 支持
... ...
重启 Nginx 服务器 service nginx restart
使用Chrome的网络工具,在地址栏中输入 chrome://net-internals/#http2
,这时便可以在 HTTP/2 sessions 中找到你的网站。