## 关于 SSL 证书
有关 SSL 的介绍可以参阅阮一峰老师的[《SSL/TLS协议运行机制的概述》](http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html)。
SSL 证书主要有两个功能:**加密**和**身份证明**,通常需要购买,也有免费的,本文使用阿里云的一年免费期的ssl证书。
## 申请免费证书
阿里云控制台-产品与服务-安全(云盾)-SSL证书,点击购买证书,选择免费型DV SSL->补全申请签发证书,然后下载证书。
## 配置证书
1. 进入nginx配置目录,增加certs/文件夹,把刚刚下载的两个文件上传到certs/文件夹中。
2. 对443端口和80端口进行监听,443端口要启用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
}
~~~
## HTTPS服务器优化
### 减少 CPU 运算量
SSL 的运行计算需要消耗额外的 CPU 资源,一般多核处理器系统会运行多个工作进程([worker processes](http://nginx.org/en/docs/ngx_core_module.html#worker_processes)),进程的数量不会少于可用的 CPU 核数。SSL 通讯过程中『握手』阶段的运算最占用 CPU 资源,有两个方法可以减少每台客户端的运算量:
* **激活[keepalive](http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout)长连接,一个连接发送更多个请求**
* **复用 SSL 会话参数,在并行并发的连接数中避免进行多次 SSL『握手』**
这些会话会存储在一个 SSL 会话缓存里面,通过命令[ssl\_session\_cache](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache)配置,可以使缓存在机器间共享,然后利用客戶端在『握手』阶段使用的`seesion id`去查询服务端的 session cathe(如果服务端设置有的话),简化『握手』阶段。
1M 的会话缓存大概包含 4000 個会话,默认的缓存超时时间为 5 分钟,可以通过使用[ssl\_session\_timeout](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout)命令设置缓存超时时间。下面是一個拥有 10M 共享会话缓存的多核系统优化配置例子:
~~~
http {
#配置共享会话缓存大小
ssl_session_cache shared:SSL:10m;
#配置会话超时时间
ssl_session_timeout 10m;
server {
#...
#设置长连接
keepalive_timeout 70;
#...
~~~
### 使用 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**响应头:
![](https://box.kancloud.cn/2e229e47756529acfd3ac1ab0ebd576f_986x426.png)
浏览器在获取该响应头后,在`max-age`的时间内,如果遇到 HTTP 连接,就会通过 307 跳转強制使用 HTTPS 进行连接,并忽略其它的跳转设置(如 301 重定向跳转):
![](https://box.kancloud.cn/9c4b546d46e9358990413ab9343c41b6_1280x1030.png)
307 跳转**Non-Authoritative-Reason**响应头
![](https://box.kancloud.cn/24675f5ac4ecda01ba3c09b3be894bc9_576x312.png)
### 加强 HTTPS 安全性
HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性在逐年降低,在 2014 年的时候,**Google 官方博客就宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书**,可参阅[Rabbit\_Run](http://www.freebuf.com/author/rabbit_run)在 2014 年发表的文章:[《为什么Google急着杀死加密算法SHA-1》](http://www.freebuf.com/news/topnews/44288.html)
为此,主流的 HTTPS 配置方案应该避免 SHA-1,可以使用[迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)](https://zh.wikipedia.org/wiki/%E8%BF%AA%E8%8F%B2-%E8%B5%AB%E7%88%BE%E6%9B%BC%E5%AF%86%E9%91%B0%E4%BA%A4%E6%8F%9B)方案。
首先在目录`/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;
#...
~~~
- Apache
- 【Apache运维基础(1)】Apache的安装与使用
- 【Apache运维基础(2)】主配置文件说明
- 【Apache运维基础(3)】虚拟主机配置说明
- 【Apache运维基础(4)】Apache的Rewrite攻略(1)
- 【Apache运维基础(5)】Apache的Rewrite攻略(2).htaccess文件
- 【Apache运维基础(6)】Apache的日志管理与分析
- 工具篇
- supervisor进程管理器
- Haproxy安装与配置
- Nginx
- 【nginx网站性能优化篇(1)】gzip压缩与expire浏览器缓存
- 【nginx网站性能优化篇(2)】反向代理实现Apache与Nginx的动静分离(LNMPA)
- 【nginx网站性能优化篇(3)】反向代理实现负载均衡
- 【nginx网站性能优化篇(4)】理解nginx的高并发原理及其配置调优
- 【nginx运维基础(1)】Nginx的编译安装与使用
- 【nginx运维基础(2)】Nginx的配置文件说明及虚拟主机配置示例
- 【nginx运维基础(3)】Nginx的编译PHP
- 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)
- 【nginx运维基础(5)】Nginx的location攻略
- 【nginx运维基础(6)】Nginx的Rewrite语法详解
- 【nginx运维基础(7)】配置SSL支持https访问
- 【nginx运维基础(8)】配置支持http2协议
- 【nginx运维基础(9)】了解PHP-FPM 与 Nginx 的通信机制
- 其它
- Apache与Nginx下php隐藏http头部版本信息的实现方法
- CURL与PHP-CLI的应用【CLI篇】
- CURL与PHP-CLI的应用【Curl篇】
- Linux之SAMBA共享服务
- 【Linux常识篇(1)】所谓的正向代理与反向代理
- 【Linux常识篇(2)】理解inode
- 【Linux常识篇(3)】文件及文件夹的ctime atime mtime的含义详解
- centOS使用手记
- 服务器日志分析
- 高频命令
- df
- mv
- gzip
- cp
- tar
- touch
- cat
- uniq
- nl
- more
- rmdir
- less
- mkdir
- head
- rm
- tail
- 五大查询命令
- vi&vim
- ls与目录结构
- grep
- awk
- sed
- 其他高频命令