Nginx三部曲(3)SSL
我们将告诉你 Nginx 的运作模式、蕴含的概念,怎样通过调优 Nginx 来提高应用性能,或是如何设置它的启动和运行。
这个教程有三个部分:
基本概念 —— 这部分需要去了解 Nginx 的一些指令和使用场景,继承模型,以及 Nginx 如何选择 server 块,location 的顺序。
SSL 安装 —— 如何配置服务器使用 HTTPS
创建这个系列,我们希望,一是作为参考书,可以通过快速查找到相关问题(比如 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的更多相关文章
- Nginx 下配置SSL证书的方法
1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...
- Nginx配置免费SSL证书StartSSL,解决Firefox不信任问题
先在StartSSL上申请免费一年的SSL证书,具体过程网上很多教程.然后把申请到的key和crt文件上传到服务器,比如/usr/local/nginx/certs/. Nginx配置SSL证书 直接 ...
- CentOS6.5 下在Nginx中添加SSL证书以支持HTTPS协议访问
参考文献: 1. NginxV1.8.0安装与配置 2. CentOS下在Nginx中添加SSL证书以支持HTTPS协议访问 3. nginx配置ssl证书的方法 4.nginx强制使用https访问 ...
- 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 ...
- nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in ......
nginx如果未开启SSL模块,配置https时提示错误 nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_modu ...
- Linux下Nginx安全证书ssl配置方法
分享下我是如何一步步在Nginx上配置SSL的.首先,确保安装了OpenSSL库,并且安装Nginx时使用了–with-http_ssl_module参数. 初学者或者菜鸟建议使用LNMP进行一键安装 ...
- Nginx+Tomcat Https SSL部署方案
1.软件版本: nginx-1.15+ tomcat-8.0+ 2.先解决一个疑问:Tomcat到底需不需要配置SSL? 答案:不需要 3.SSL申请 使用腾讯云.阿里云的服务器,会更加方便申请.(申 ...
- Nginx自建SSL证书部署HTTPS网站
一.创建SSL相关证书 1.安装Nginx(这里为了测试使用yum安装,实际看具体情况) [root@localhost ~]# yum install nginx -y #默认yum安装已经支持SS ...
- Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183)
Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183) 漏洞说明 // 基于Nginx的https网站被扫描出SSL/TLS协议信息泄露漏洞(CVE-2016-2183),该漏 ...
随机推荐
- LeetCode算法题-Reverse String(Java实现)
这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...
- 【PS技巧】如何拼图
1.材料准备 根据对图片的内容表达,粗略的“计划”,每张图片摆放位置及尺寸.C与D等高,C/D与B叠高后与A等高.C与D叠宽后与B等宽. 2.记录每张图片原始大小 (1)双击工作区,打开待拼接图片 ( ...
- VS的快捷键汇总
C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...
- SQL Server 数据导入Mysql具体教程
SQLServer2005数据导入Mysql到具体教程(測试) SQL SERVER数据导入MYSQL文件夹 1.Navicat for MySQL 版本号10.0.9 2.创建目标数据库 3.创 ...
- golang 开发gui
可能因为我电脑上的mingw下只有gcc,没有g++的原因,之前用walk和andlabs都不成功 最后用github上gxui的sample代码终于编译出来一个丑陋的GUI,但编译过程也提示了一堆类 ...
- [HEOI2016/TJOI2016]求和
嘟嘟嘟 好多人(神仙)都说这是NTT例题,然后我就做了-- 做这题,需要一下前置技能: 1.第二类斯特林数 2.NTT 3.没有公式恐惧症 额--不会斯特林数的话(就像我),知道通项公式也行. 这个博 ...
- maven-resources-plugin插件关于占位符不生效问题
插件版本: <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0. ...
- 通过 PHP,可以把文件上传到服务器。
创建一个文件上传表单 允许用户从表单上传文件是非常有用的. 请看下面这个供上传文件的 HTML 表单: <html> <body> <form action=" ...
- Linux下简单的缓冲区溢出
缓冲区溢出是什么? 科班出身,或者学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持 ...
- sqlalchemy和flask-sqlalchemy的几种分页方法
sqlalchemy中使用query查询,而flask-sqlalchemy中使用basequery查询,他们是子类与父类的关系 假设 page_index=1,page_size=10:所有分页查询 ...