## 關于 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**響應頭:

瀏覽器在獲取該響應頭后,在`max-age`的時間內,如果遇到 HTTP 連接,就會通過 307 跳轉強制使用 HTTPS 進行連接,并忽略其它的跳轉設置(如 301 重定向跳轉):

307 跳轉**Non-Authoritative-Reason**響應頭

### 加強 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
- 其他高頻命令