Nginx 教程(3):SSL 设置

SSL 和 TLS

 

SSL(Socket Secure Layer 缩写)是一种经过 HTTP 提供安全链接的协议。nginx

 

SSL 1.0 由 Netscape 开发,但因为严重的安全漏洞从未公开发布过。SSL 2.0 于 1995 年发布,它存在一些问题,致使了最终的 SSL 3.0 在 1996 年发布。web

 

TLS(Transport Layer Security 缩写)的第一个版本是做为 SSL 3.0 的升级版而编写的。以后 TLS 1.1 和 1.2 出来了。如今,就在不久以后,TLS 1.3 即将推出(这确实值得期待),而且已经被一些浏览器所支持。浏览器

 

从技术上讲,SSL 和 TLS 是不一样的(由于每一个协议都描述了协议的不一样版本),但其中使用的许多名称是能够互换的。缓存

 

基本 SSL/TLS 配置

 

为了处理 HTTPS 流量,你须要具备 SSL/TLS 证书。你能够经过使用 Let’s encrypt 以生成免费的证书。安全

 

当你拥有证书以后,你能够经过如下的方式轻易切换至 HTTPS:服务器

 

  • 开始监听端口 443(当你输入 https://sample.co 时浏览器将使用的默认端口)session

  • 提供证书及其密钥dom

 

server {测试

  listen 443 ssl default_server;ui

  listen [::]:443 ssl default_server;

 

  ssl_certificate /etc/nginx/ssl/netguru.crt;

  ssl_certificate_key /etc/nginx/ssl/netguru.key;

}

 

咱们也想经过调整配置实现:

 

  • 仅使用 TLS 协议。因为众所周知的漏洞,全部的 SSL 版本都将再也不使用

  • 使用预约义的安全的服务器密码(相似于协议的状况 – 那些日子只有少数密码被认为是安全的)

 

请牢记,上述设置老是在变化的。时不时从新更新是个好主意。

 

ssl_protocols TLSv1 TLSv1.TLSv1.2;

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;

ssl_prefer_server_ciphers on;

 

server {

  listen 443 ssl default_server;

  listen [::]:443 ssl default_server;

 

  ssl_certificate /etc/nginx/ssl/netguru.crt;

  ssl_certificate_key /etc/nginx/ssl/netguru.key;

}

 

TLS 会话恢复

 

使用 HTTPS,在 TCP 之上须要增长 TLS 握手。这大大增长了此前实际数据传输的时间。假设你从华沙请求 /image.jpg,并接入到柏林最近的服务器:

为了在 TLS 握手期间节省一个 roundtrip 时间,以及生成新密钥的计算开销,咱们能够重用在第一个请求期间生成的会话参数。客户端和服务器能够将会话参数存储在会话 ID 密钥的后面。在接下来的 TLS 握手过程当中,客户端能够发送会话 ID,若是服务器在缓存中仍然有正确的条目,那么会重用前一个会话所生成的参数。

 

server {

    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 1h;

}

 

OCSP Stapling

 

SSL 证书能够随时撤销。浏览器为了知道给定的证书是否再也不有效,须要经过在线证书状态协议 (Online Certificate Status Protocol ,OCSP) 执行额外的查询。无需用户执行指定的 OCSP 查询,咱们能够在服务器上执行此操做,缓存其结果,并在 TLS 握手期间为客户端提供 OCSP 响应。它被称为OCSP stapling。

 

server {

  ssl_stapling on;

  ssl_stapling_verify on;                               # verify OCSP response

  ssl_trusted_certificate /etc/nginx/ssl/lemonfrog.pem# tell nginx location of all intermediate certificates

 

  resolver 8.8.8.8 8.8.4.4 valid=86400s;                # resolution of the OCSP responder hostname

  resolver_timeout 5s;

}

 

Security headers

 

有一些标头确实值得调整以提供更高的安全性。有关更多关于标头及其详细信息,你绝对应该查看OWASP 项目之安全标头。

 

HTTP Strict-Transport-Security

 

或简称 HSTS,强制用户代理在向源发送请求时使用 HTTPS。

 

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

 

X-Frame-Options

 

表示浏览器是否须要在一帧、一个 iframe 或一个对象标签中渲染页面。

 

add_header X-Frame-Options DENY;

 

X-Content-Type-Options

 

此选项将阻止浏览器在判断文件类型时嗅探文件。文件将会按照 Content-Type 头中声明的格式转译。

 

add_header X-Content-Type-Options nosniff;

 

Server tokens

 

另外一个很好的作法是在 HTTP 响应头字段中隐藏有关 Web 服务器的信息:

 

Server : nginx/1.13.2

 

实现此功能能够经过禁用 server_tokens 指令:

 

server_tokens off;

 

附录 :: Let’s Encrypt

 

安装

 

最新的安装包能够在这里找到。

 

为了测试使用暂存环境,不排除速率限制。

 

生成新证书

 

certbot certonly --webroot --webroot-path /var/www/netguru/current/public/  

          -foo.netguru.co 

          -bar.netguru.co

 

确保可以正确更新。

 

certbot renew --dry-run

 

确保你在 crontab 添加了自动更新。运行 crontab -e,同时添加下边一行代码

 

 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/usr/sbin/nginx -s reload"

 

检查 SSL 是否可以经过 ssllabs 正常运行。

相关文章
相关标签/搜索