我们将告诉你 Nginx 的运作模式、蕴含的概念,怎样通过调优 Nginx 来提高应用性能,或是如何设置它的启动和运行。

这个教程有三个部分:

创建这个系列,我们希望,一是作为参考书,可以通过快速查找到相关问题(比如 gzip 压缩,SSL 等)的解决方式,也可以直接通读全文。为了获得更好的学习效果,我们建议你在本机安装 Nginx 并且尝试进行实践。

SSL 和 TLS

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

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

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 时浏览器将使用的默认端口)

  • 提供证书及其密钥

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 协议。由于众所周知的漏洞,所有的 SSL 版本都将不再使用

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

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

ssl_protocols TLSv1 TLSv1.1 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/  \

-d foo.netguru.co \

-d 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 正常运行。

Nginx三部曲(3)SSL的更多相关文章

  1. Nginx 下配置SSL证书的方法

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...

  2. Nginx配置免费SSL证书StartSSL,解决Firefox不信任问题

    先在StartSSL上申请免费一年的SSL证书,具体过程网上很多教程.然后把申请到的key和crt文件上传到服务器,比如/usr/local/nginx/certs/. Nginx配置SSL证书 直接 ...

  3. CentOS6.5 下在Nginx中添加SSL证书以支持HTTPS协议访问

    参考文献: 1. NginxV1.8.0安装与配置 2. CentOS下在Nginx中添加SSL证书以支持HTTPS协议访问 3. nginx配置ssl证书的方法 4.nginx强制使用https访问 ...

  4. nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37

    一:开始Nginx的SSL模块 1.1 Nginx如果未开启SSL模块,配置Https时提示错误 1 nginx: [emerg] the "ssl" parameter requ ...

  5. nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in ......

    nginx如果未开启SSL模块,配置https时提示错误 nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_modu ...

  6. Linux下Nginx安全证书ssl配置方法

    分享下我是如何一步步在Nginx上配置SSL的.首先,确保安装了OpenSSL库,并且安装Nginx时使用了–with-http_ssl_module参数. 初学者或者菜鸟建议使用LNMP进行一键安装 ...

  7. Nginx+Tomcat Https SSL部署方案

    1.软件版本: nginx-1.15+ tomcat-8.0+ 2.先解决一个疑问:Tomcat到底需不需要配置SSL? 答案:不需要 3.SSL申请 使用腾讯云.阿里云的服务器,会更加方便申请.(申 ...

  8. Nginx自建SSL证书部署HTTPS网站

    一.创建SSL相关证书 1.安装Nginx(这里为了测试使用yum安装,实际看具体情况) [root@localhost ~]# yum install nginx -y #默认yum安装已经支持SS ...

  9. Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183)

    Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183) 漏洞说明 // 基于Nginx的https网站被扫描出SSL/TLS协议信息泄露漏洞(CVE-2016-2183),该漏 ...

随机推荐

  1. Hibernate基本映射类型

  2. python六十四课——高阶函数练习题(三)

    案例五:求两个列表元素的和,返回新列表lt1 = [1,2,3,4]lt2 = [5,6]效果:[6,8,10,12] lt1=[1,2,3,4] lt2=[5,6] print(list(map(l ...

  3. ndim 与 shape的区别

    [[ ., ., .], [ ., ., .]] 在上面这个例子中,数组的ndim为2(它有两个维度(简单的辨别两层方括号)). 第一个维度的长度为2,也就是有两个子数组 第二个维度的长度为3,也就是 ...

  4. Linux:Day8(上) 文件系统挂载和管理工具

    文件系统管理: 将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为称之为挂载: 解除此关联关系的过程称之为卸载: 把设备关联挂载点:Mount Point ...

  5. DVR登录绕过漏洞(CVE-2018-9995)

    ###漏洞描述 此漏洞允许攻击者通过修改“Cookie: uid=admin” 之后访问特定 DVR 的控制面板,返回此设备的明文管理员凭证. ###漏洞利用 1.利用代码 curl "ht ...

  6. AI LeNet

    LeNet 参考链接: http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf https://www.charleychai.com/blogs/20 ...

  7. 图片完全填充CardView区域

    在Android开发中,使用CardView来显示我们需要展示的图片,但是有时候显示出来的图片并没有填充整个CardView区域,为了让需要展示的图片填充整个CardView区域,只需要在ImageV ...

  8. C# Oracle 时间字符串转时间类型

    C# 字符串转时间类型 yyyy-MM-dd HH:mm:ss  yyyy-MM-dd hh:mm:ss d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. d ...

  9. Vue.js 系列教程 1:渲染,指令,事件

    原文:intro-to-vue-1-rendering-directives-events 译者:nzbin 如果要我用一句话描述使用 Vue 的经历,我可能会说“它如此合乎常理”或者“它提供给我需要 ...

  10. 这20个Docker Command,有几个是你会的?

    在这之前呢,也写过两篇关于Docker基础入门类的文章 Docker容器技术入门(一) Docker容器技术入门(二) 很多人都感觉这文章这么简单.这么基础,可是别忘记了"万丈高楼平地起&q ...