有关 SSL 的介绍能够参阅阮一峰老师的《SSL/TLS协议运行机制的概述》。html
SSL 证书主要有两个功能:加密和身份证实,一般须要购买,也有免费的,本文使用阿里云的一年免费期的ssl证书。nginx
阿里云控制台-产品与服务-安全(云盾)-SSL证书,点击购买证书,选择免费型DV SSL->补全申请签发证书,而后下载证书。算法
server { listen 443; server_name bjubi.com; // 你的域名 ssl on; root /var/www/bjubi.com; // 前台文件存放文件夹,可改为别的 index index.html index.htm;// 上面配置的文件夹里面的index.html ssl_certificate /etc/nginx/conf.d/certs/site2/www.site1.com.crt; ssl_certificate_key /etc/nginx/conf.d/certs/site2/www.site1.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { index index.html index.htm; } } server { listen 80; server_name www.site1.com;// 你的域名 rewrite ^(.*)$ https://$host$1 permanent;// 把http的域名请求转成https }
SSL 的运行计算须要消耗额外的 CPU 资源,通常多核处理器系统会运行多个工做进程(worker processes),进程的数量不会少于可用的 CPU 核数。SSL 通信过程当中『握手』阶段的运算最占用 CPU 资源,有两个方法能够减小每台客户端的运算量:浏览器
这些会话会存储在一个 SSL 会话缓存里面,经过命令ssl_session_cache配置,可使缓存在机器间共享,而后利用客戶端在『握手』阶段使用的seesion id
去查询服务端的 session cathe(若是服务端设置有的话),简化『握手』阶段。缓存
1M 的会话缓存大概包含 4000 個会话,默认的缓存超时时间为 5 分钟,能够经过使用ssl_session_timeout命令设置缓存超时时间。下面是一個拥有 10M 共享会话缓存的多核系统优化配置例子:安全
http { #配置共享会话缓存大小 ssl_session_cache shared:SSL:10m; #配置会话超时时间 ssl_session_timeout 10m; server { #... #设置长链接 keepalive_timeout 70; #...
HSTS – HTTP Strict Transport Security,HTTP严格传输安全。它容许一个 HTTPS 网站要求浏览器老是经过 HTTPS 来访问,这使得攻击者在用戶与服务器通信过程当中拦截、篡改信息以及冒充身份变得更为困难。服务器
只要在 Nginx 配置文件加上如下头信息就能够了:session
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;
当用户进行 HTTPS 链接的时候,服务器会发送一个Strict-Transport-Security响应头:并发
浏览器在获取该响应头后,在max-age
的时间内,若是遇到 HTTP 链接,就会经过 307 跳转強制使用 HTTPS 进行链接,并忽略其它的跳转设置(如 301 重定向跳转):优化
307 跳转Non-Authoritative-Reason响应头
HTTPS 基础配置采起的默认加密算法是 SHA-1,这个算法很是脆弱,安全性在逐年下降,在 2014 年的时候,Google 官方博客就宣布在 Chrome 浏览器中逐渐下降 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书,可参阅Rabbit_Run在 2014 年发表的文章:《为何Google急着杀死加密算法SHA-1》
为此,主流的 HTTPS 配置方案应该避免 SHA-1,可使用迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案。
首先在目录/etc/ssl/certs
运行如下代码生成dhparam.pem
文件:
openssl dhparam -out dhparam.pem 2048
而后加入 Nginx 配置:
#优先采起服务器算法 ssl_prefer_server_ciphers on; #使用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"; #减小点击劫持 add_header X-Frame-Options DENY; #禁止服务器自动解析资源类型 add_header X-Content-Type-Options nosniff; #防XSS攻击 add_header X-Xss-Protection 1;
优化后的综合配置
worker_processes auto; http { #配置共享会话缓存大小,视站点访问状况设定 ssl_session_cache shared:SSL:10m; #配置会话超时时间 ssl_session_timeout 10m; server { listen 443 ssl; server_name www.example.com; #设置长链接 keepalive_timeout 70; #HSTS策略 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #证书文件 ssl_certificate www.example.com.crt; #私钥文件 ssl_certificate_key www.example.com.key; #优先采起服务器算法 ssl_prefer_server_ciphers on; #使用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"; #减小点击劫持 add_header X-Frame-Options DENY; #禁止服务器自动解析资源类型 add_header X-Content-Type-Options nosniff; #防XSS攻擊 add_header X-Xss-Protection 1; #...