Nginx上部署HTTPS + HTTP2
Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev(或者OpenSSL),且ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/,然后在编译配置Nginx时要指定--with-http_ssl_module和--with-http_v2_module。另外,若要在本地运行openssl命令,要安装OpenSSL包,本人用的OpenSSL-1.0.2g。注:本文采用Ubuntu 16.04上的操作实例。
下图展示了数字证书(HTTPS中使用的由CA签名的公钥证书)的签名和验证原理:
- TLS保障信息传输安全:对于每一次新的对话(连接握手阶段。这里讲的对话不是HTTP中涉及的应用层对话,而是TLS对话),客户端和服务端都会协商一个对话密钥和对称加密算法(了解更多可参考“加密套件”“四次握手”相关内容)用来加解密信息,这样就避免非对称加解密耗时过长,运算速度更快;而Public/Private密钥对只用于"pre-master key"的加解密。特别地,在连接断开后,旧对话的恢复(两种实现方法:session ID和session ticket)不属于建立新的对话,无需协商一个新的对话密钥和对称加密算法。
- HTTP2:HTTP2 基于SPDY设计,支持HTTPS。但HTTP2与SPDY不同的是,不强制使用 HTTPS,但目前还没有浏览器支持;HTTP2 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DELEFT。HTTP2基本兼容HTTP1.x的语义,只是改变了HTTP1.x的传输方式,在连接中是否使用HTTP2是通过协议协商(NPN、ALPN或Upgrade头)来决定的。HTTP2拥有许多新特性:
- 二进制协议:HTTP2.0协议采用二进制格式,实现方便且健壮;HTTP1.x采用的是文本格式
- 头部压缩:HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源,头压缩能够很好的解决该问题
- 多路复用:多个请求和响应通过一个 TCP 连接并发完成,还支持请求优先级划分和流控制
- Server Push:服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端先解析 HTML 再发送这些请求。当客户端需要的时候,它们已经在客户端了
下图是HTTP2 Frame 格式:RFC7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)
- Nginx上部署HTTPS + HTTP2
- 自签发证书:开发测试环境下可以在其他机器上去生成证书,然后再将所生成server.crt和server.key复制一份至Nginx的/usr/local/nginx/conf下即可
$ cd /usr/local/nginx/conf
$ openssl genrsa -des3 -out server.key 1024 #建议:2048
$ openssl req -new -key server.key -out server.csr #证书签名请求(CSR)
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
$ openssl x509 -req -days -in server.csr -signkey server.key -out server.crt #证书签名 - 修改配置文件nginx.conf:为减少CPU负载,建议只运行一个工作进程,并且开启keep-alive。另外,version 0.6.7以上的Nginx ssl_certificate和ssl_certificate_key的默认关联目录为nginx.conf所在的目录,默认文件名都为cert.pem
worker_processes 1;
server { server_name YOUR_DOMAINNAME;
listen 443 ssl http2;# http2 is available only since OpenSSL version 1.0.2
listen 80;
if ($scheme = http) {
#rewrite ^(.*)$ https://$server_name$1 permanent;
return 301 https://$server_name$request_uri;} ssl_certificate server.crt; ssl_certificate_key server.key; keepalive_timeout 70; }
- 重启Nginx:HTTPS在Nginx上的部署至此已近完毕,然后就可以通过https://YOUR_DOMAINNAME来访问了。由于本例中采用自签发证书(不同于CA自签名的Root证书),在Chrome下将看到如图警告信息,表明该证书不受信任(当然,如果你的页面中嵌套了HTTP的资源请求,chrome也会有该提示)。浏览器在默认情况下内置了一些CA机构的Root证书,这些证书受到绝对信任。
如图Chromium浏览器的Secure Connection显示连接是TLS 1.2加密的。另外,本人在Chromium 58.0.3029.110 和 Firefox 53.0.3 下均证实了HTTP2被成功启用:
- 私钥保护:私钥是重要的财产,尽可能限制能接触到私钥的人
- 在一台可信的计算机上生成私钥和CSR(Certificate Signing Requests)。有一些CA会为你生成密钥和CSR,但这样做明显不妥
- 受密码保护的密钥可以阻止在备份系统中被截获
- 在发现被截获后,撤回老的证书,生成新的密钥和证书
- 每年更新证书,总是使用最新的私钥
- 部署证书链:证书链(Certificate Chain)包括信任锚(CA 证书)和签名证书,是由一系列 CA 证书发出的证书序列,最终以根 CA 证书结束;Web 浏览器已预先配置了一组浏览器自动信任的根 CA 证书,来自其他证书授权机构的所有证书都必须附带证书链,以检验这些证书的有效性。在很多部署场景中,单一的服务器证书显得不足,而多个证书则需要建立一个信任链。一个常见的问题是正确的配置了服务器证书但却搞忘了包含其他所需要的证书。此外,虽然其他证书通常有很长的有效期,但它们也会过期,如果它们过期就会影响整个链条。一个无效证书链会导致服务器证书失效和客户端浏览器报警告,这个问题有时候不是那么容易被检测到,因为有些浏览器可以自己重构一个完整的信任链而有些则不行。如果证书配置不当,可能会报“该证书并非来自可信赖的授权中心”,可在 https://www.geocerts.com/ssl-checker 查询证书及链认证如下图:
关于Nginx上部署证书链:
if you have a chain certificate file (sometimes called an intermediate certificate)
you don't specify it separately like you do in Apache. Instead you need to add the
information from the chain cert to the end of your main certificate file. This can be done
by typing "cat chain.crt >> mysite.com.crt" on the command line. Once that is done you
won't use the chain cert file for anything else, you just point Nginx to the main certificate file
下图展示了证书链的工作原理:
- Nginx上SSL配置指令说明:下边只列举了部分,更多配置项可参考 http://www.nginx.cn/doc/optional/ssl.html。
- ssl:开启HTTPS
syntax:ssl [on|off]
default:ssl off
context:main, server
- ssl_certificate:证书文件,默认证书和密钥都位于cert.pem中,该文件还可以包含其他证书。自version 0.6.7起,ssl_certificate的默认关联目录为nginx.conf所在的目录。
syntax:ssl_certificate file
default:ssl_certificate cert.pem
context:main, server
- ssl_certificate_key:证书密钥文件,默认密钥位于cert.pem中。自version 0.6.7起,ssl_certificate_key的默认关联目录为nginx.conf所在的目录。
syntax:ssl_certificate_key file
default:ssl_certificate_key cert.pem
context:main, server
- ssl_client_certificate:Indicates file with certificates CA in PEM format, utilized for checking the client certificates.
syntax:ssl_client_certificate file
default:none
context:main, server
- ssl_dhparam:Indicates file with Diffie-Hellman parameters in PEM format, utilized for negotiating TLS session keys.
syntax: ssl_dhparam file
default: none
context: main, server
- ssl_ciphers:Directive describes the permitted ciphers. Ciphers are assigned in the formats supported by OpenSSL.
syntax: ssl_ciphers file
default: ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
context: main, server
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
Complete list can be looked with the following command:
openssl ciphers
- ssl_prefer_server_ciphers:Requires protocols SSLv3 and TLSv1 server ciphers be preferred over the client's ciphers.
syntax: ssl_prefer_server_ciphers [on|off]
default: ssl_prefer_server_ciphers off
context: main, server
- ssl_protocols:Directive enables the protocols indicated. TLS v1.0以上的版本是比较安全的,最好是弃用SSLv3以下的版本,SSLv2以下坚决不用
syntax: ssl_protocols [SSLv2] [SSLv3] [TLSv1]
default: ssl_protocols SSLv2 SSLv3 TLSv1
context: main, server
- ssl_session_cache:The directive sets the types and sizes of caches to store the SSL sessions.
syntax:ssl_session_cache off|none|builtin:size and/or shared:name:size
default:ssl_session_cache off
context:main, server
ssl_session_cache builtin:1000 shared:SSL:10m;
- ssl_session_timeout:Assigns the time during which the client can repeatedly use the parameters of the session, which is stored in the cache.
syntax:ssl_session_timeout time
default:ssl_session_timeout 5m
context:main, server
- Nginx上HTTP2配置指令说明:详情可参考 http://nginx.org/en/docs/http/ngx_http_v2_module.html
- 参考
- 图解SSL/TLS协议:http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
- SSL/TLS协议运行机制的概述:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
- SSL/TLS部署最佳实践:http://www.techug.com/post/ssl-tls.html
- RFC7540 - Hypertext Transfer Protocol Version 2 (HTTP/2):https://tools.ietf.org/html/rfc7540
- HTTP/2 的协议协商机制:https://imququ.com/post/protocol-negotiation-in-http2.html
- Nginx HttpSSL:http://www.nginx.cn/doc/optional/ssl.html
Nginx上部署HTTPS + HTTP2的更多相关文章
- Nginx上部署HTTPS
Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev,且ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/, ...
- 用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面
用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面 1.什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地 ...
- nginx上搭建https
nginx上配置https的条件: 1.SSL证书和服务器私钥文件 2.nginx支持SSL模块 一.获取SSL证书 网上有提供权威认证的SSL证书的网站,但多数是收费的,而且不便宜.在正式的生产环境 ...
- nginx上部署python web
nginx上部署python web http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
- 在nginx上部署vue项目(history模式);
在nginx上部署vue项目(history模式): vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想has ...
- 云计算之路-阿里云上:在SLB上部署https遇到的问题及解决方法
一.问题场景 这个问题只会出现在云服务器操作系统使用Windows Server 2012的场景,如果使用的是Windows Server 2008 R2则不存在这个问题. 二.https部署场景 1 ...
- 在Nginx上部署ThinkPHP,解决Pathinfo问题
在Nginx上部署ThinkPHP,解决Pathinfo问题 事实上.要解决nginx不支持pathinfo的问题.有两个解决思路,一是不使用pathinfo模式,二是改动nginx的配置文件,使它支 ...
- 在nginx上部署vue项目(history模式)--demo实列;
在很早之前,我写了一篇 关于 在nginx上部署vue项目(history模式) 但是讲的都是理论,所以今天做个demo来实战下.有必要让大家更好的理解,我发现搜索这类似的问题还是挺多的,因此在写一篇 ...
- django项目在uwsgi+nginx上部署遇到的坑
本文来自网易云社区 作者:王超 问题背景 django框架提供了一个开发调试使用的WSGIServer, 使用这个服务器可以很方便的开发web应用.但是 正式环境下却不建议使用这个服务器, 其性能.安 ...
随机推荐
- Partition算法以及其应用详解下(Golang实现)
接前文,除了广泛使用在快速排序中.Partition算法还可以很容易的实现在无序序列中使用O(n)的时间复杂度查找kth(第k大(小)的数). 同样根据二分的思想,每完成一次Partition我们可以 ...
- python学习笔记(9)--函数
函数定义: def <函数名>(<参数(0个或多个)>): 函数体 return <返回值> 参数有非可选参数,和可选参数,可选参数放在参数列表的最后,可以为可选参 ...
- 使用synchronized 实现ReentrantLock(美团面试题目)
刚看到这个题目的时候无从下手,因为觉得synchronized和lock在加锁的方式上有很大不同,比如,看看正常情况下synchronized时如何加锁的. 方式一: public synchroni ...
- edge
https://www.cnblogs.com/st-leslie/p/6784990.html
- Bootstrap之登陆页面范例
代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta ...
- josn的格式化
public String formatJson(Object obj) { com.alibaba.fastjson.JSONObject json=(com.alibaba.fastjson.JS ...
- redis两种持久化
Redis 提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据 ...
- CF980E
题面 Panel 国将举办名为数字游戏的年度表演.每个省派出一名选手. 国家有 n 个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连.第 i 个省出来的代表有 2^i 名粉丝. 今年, ...
- Nginx 防盗链 secure_link 模块
L:76 需要通过 --with-http_secure_link_module 编译进Nginx secure_link 指令 Syntax: secure_link expression; Def ...
- Redis——redis使用redis-dump,redis-load导出导入数据——【三】
来源 https://www.cnblogs.com/dadonggg/p/8662455.html https://blog.csdn.net/chenxinchongcn/article/deta ...