Nginx配置HTTPS

Nginx配置HTTPS

HTTPS 是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。

在 Nginx 中,配置 HTTPS 也非常的简单,我们首先需要准备好与我们域名关联的 HTTPS 证书,接着,再配置对应的证书目录即可。

Nginx配置HTTPS案例

基础配置

要开启 HTTPS 服务,在配置文件信息块(server block),必须使用监听命令 listen 的 ssl 参数和定义服务器证书文件和私钥文件,如下所示:

server { #ssl参数 listen 443 ssl; server_name haicoder.net; #证书文件 ssl_certificate haicoder.net.crt; #私钥文件 ssl_certificate_key haicoder.net.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; #... }

证书文件会作为公用实体發送到每台连接到服务器的客戶端,私钥文件作为安全实体,应该被存放在具有一定权限限制的目录文件,并保证 Nginx 主进程有存取权限。

私钥文件也有可能会和证书文件同放在一个文件中,如下面情況:

ssl_certificate www.haicoder.net.cert; ssl_certificate_key www.haicoder.net.cert;

这种情況下,证书文件的的读取权限也应该加以限制,仅管证书和私钥存放在同一个文件里,但是只有证书会被发送到客戶端。

命令 ssl_protocolsssl_ciphers 可以用来限制连接只包含 SSL/TLS 的加強版本和算法,默认值如下:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5;

由于这两个命令的默认值已经好几次发生了改变,因此不建议显性定义,除非有需要额外定义的值,如定义 D-H 算法:

#使用DH文件 ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #定义算法 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #...

Nginx HTTPS优化

减少CPU运算量

SSL 的运行计算需要消耗额外的 CPU 资源,一般多核处理器系统会运行多个工作进程,进程的数量不会少于可用的 CPU 核数。SSL 通讯过程中 “握手” 阶段的运算最占用 CPU 资源,有两个方法可以减少每台客户端的运算量:

  • 激活 keepalive 长连接,一个连接发送更多个请求
  • 复用 SSL 会话参数,在并行并发的连接数中避免进行多次 SSL 握手

这些会话会存储在一个 SSL 会话缓存里面,通过命令 ssl_session_cache 配置,可以使缓存在机器间共享,然后利用客戶端在握手阶段使用的 seesion id 去查询服务端的 session cathe(如果服务端设置有的话),简化握手阶段。

1M 的会话缓存大概包含 4000 个会话,默认的缓存超时时间为 5 分钟,可以通过使用 ssl_session_timeout 命令设置缓存超时时间。下面是一个拥有 10M 共享会话缓存的多核系统优化配置例子:

worker_processes auto; http { #配置共享会话缓存大小 ssl_session_cache shared:SSL:10m; #配置会话超时时间 ssl_session_timeout 10m; server { listen 443 ssl; server_name www.haicoder.net; #设置长连接 keepalive_timeout 70; ssl_certificate www.haicoder.net.crt; ssl_certificate_key www.haicoder.net.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; #...

使用HSTS策略强制浏览器使用HTTPS连接

HSTS – HTTP Strict Transport Security,HTTP严格传输安全。它允许一个 HTTPS 网站要求浏览器总是通过 HTTPS 来访问,这使得攻击者在用戶与服务器通讯过程中拦截、篡改信息以及冒充身份变得更为困难。

只要在 Nginx 配置文件加上以下头信息就可以了:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;

具体参数解释如下:

参数 描述
max-age 设置单位时间内強制使用 HTTPS 连接
includeSubDomains 可选,所有子域同时生效
preload 可选,非规范值,用于定义使用 HSTS 预加载列表
always 可选,保证所有响应都发送此响应头,包括各种內置错误响应

当用户进行 HTTPS 连接的时候,服务器会发送一个 Strict-Transport-Security 响应头。

HTTP与HTTPS混合配置

可以同时配置 HTTP 和 HTTPS 服务器,方法一如下:

server { listen 80; listen 443 ssl; server_name www.haicoder.net; ssl_certificate www.haicoder.net.crt; ssl_certificate_key www.haicoder.net.key; if ( $scheme == http ){ rewrite ^/(.*)$ https://www.haicoder.net/$1 permanent; } #... }

在 0.7.14 版本之前,在独立的 server 端口中是不能选择性开启 SSL 的。如上面的例子,SSL 只能通过使用 ssl 命令为单个 server 端口开启。

因此没有办法设置 HTTP/HTTPS 混合服务器。于是 Nginx 新增了监听命令 listen 参数 ssl 來解决这个问题,Nginx 现代版本的 ssl 命令并不推荐使用。方法二如下:

server { listen 80; server_name www.haicoder.net; rewrite ^/(.*)$ https://www.haicoder.net/$1 permanent; #... } server { listen 443 ssl; server_name www.haicoder.net; ssl_certificate www.haicoder.net.crt; ssl_certificate_key www.haicoder.net.key; #... }

方法三如下:

server { listen 80; server_name www.haicoder.net; rewrite ^ https://www.haicoder.net/$request_uri? permanent; #...}server { listen 443 ssl; server_name www.haicoder.net; ssl_certificate www.haicoder.net.crt; ssl_certificate_key www.haicoder.net.key; #...}

方法四如下:

server { listen 80; server_name www.haicoder.net; return 301 https://www.haicoder.net$request_uri;}server { listen 443 ssl; server_name www.haicoder.net; charset utf-8; ssl_certificate www.haicoder.net.crt; ssl_certificate_key www.haicoder.net.key; #...}

其中,方法四是官方推荐的写法,也是效率最高的写法。

Nginx配置HTTPS总结

HTTPS 是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。

在 Nginx 中,配置 HTTPS 也非常的简单,我们首先需要准备好与我们域名关联的 HTTPS 证书,接着,再配置对应的证书目录即可。