HTTPS簡介
HTTPS(Hyper Text Transfer Protocol Secure),是一種基於SSL/TLS的HTTP,所有的HTTP資料都是在SSL/TLS協議封裝之上進行傳輸的。HTTPS協議是在HTTP協議的基礎上,添加了SSL/TLS握手以及資料加密傳輸,也屬於應用程式層協議。Https使用的預設連接埠是443。更多HTTPS原理可以參考阮一峰老師的文章:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
SSL認證
認證類型簡介
要設定安全伺服器,使用公用鑰建立一對公私密金鑰對。大多數情況下,發送認證請求(包括自己的公開金鑰),你的公司證明材料以及費用到一個憑證授權單位(CA)。CA驗證認證請求及您的身份,然後將認證返回給您的安全伺服器。
但是內網實現一個伺服器端和用戶端傳輸內容的加密,可以自己給自己頒發認證,只需要忽略掉瀏覽器不信任的警報即可!
由CA簽署的認證為您的伺服器提供兩個重要的功能:
- 瀏覽器會自動識別認證並且在不提示使用者的情況下允許建立一個安全連線。
- 當一個CA產生一個簽署過的認證,它為提供網頁給瀏覽器的組織提供身份擔保。
多數支援ssl的web伺服器都有一個CA列表,它們的認證會被自動接受。當一個瀏覽器遇到一個其授權CA並不在列表中的認證,瀏覽器將詢問使用者是否接受或拒絕串連。
製作CA認證
ca.key CA私密金鑰:
openssl genrsa -des3 -out ca.key 2048
ca.crt CA根憑證(公開金鑰):
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
製作網站的認證並用CA簽名認證
這裡,假設網站網域名稱為www.example.com,產生com.example.com認證私密金鑰:
openssl genrsa -des3 -out www.example.com.pem 1024
製作解密後的www.example.com認證私密金鑰:
openssl rsa -in www.example.com.pem -out www.example.com.key
產生簽章要求:
openssl req -new -key www.example.com.pem -out www.example.com.csr
可以在Common Name中填入網站網域名稱,即可生產該網站的認證。
用CA進行簽名:
複製代碼 代碼如下:
openssl ca -policy policy_anything -days 365 -cert ca.crt -keyfile ca.key -in www.example.com.csr -out www.example.com.crt
可能執行簽名時,會出現“I am unable to access the ./demoCA/newcerts directory”問題:
解決方案:
mkdir -p demoCA/newcerts touch demoCA/index.txt touch demoCA/serial echo "01" > demoCA/serial
然後,再執行簽名命令即可。
基於Nginx搭建HTTPS虛擬機器主機
虛擬機器主機設定檔
upstream sslfpm { server 127.0.0.1:9000 weight=10 max_fails=3 fail_timeout=20s; } server { listen 192.168.1.*:443; server_name 192.168.1.*; #為一個server開啟ssl支援 ssl on; #為虛擬機器主機指定pem格式的認證檔案 ssl_certificate /home/wangzhengyi/ssl/wangzhengyi.crt; #為虛擬機器主機指定私密金鑰檔案 ssl_certificate_key /home/wangzhengyi/ssl/wangzhengyi_nopass.key; #用戶端能夠重複使用儲存在緩衝中的會話參數時間 ssl_session_timeout 5m; #指定使用的ssl協議 ssl_protocols SSLv3 TLSv1; #指定許可的密碼描述 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #SSLv3和TLSv1協議的伺服器密碼需求優先順序高於用戶端密碼 ssl_prefer_server_ciphers on; location / { root /home/wangzhengyi/ssl/; autoindex on; autoindex_exact_size off; autoindex_localtime on; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; error_page 404 /404.html; location = /50x.html { root /usr/share/nginx/www; } location = /404.html { root /usr/share/nginx/www; } # proxy the PHP scripts to fpm location ~ \.php$ { access_log /var/log/nginx/ssl/ssl.access.log main; error_log /var/log/nginx/ssl/ssl.error.log; root /home/wangzhengyi/ssl/; fastcgi_param HTTPS on; include /etc/nginx/fastcgi_params; fastcgi_pass sslfpm; } }
HTTPS伺服器最佳化
方法
SSL操作需要消耗CPU資源,所以在多處理器的系統,需要啟動多個背景工作處理序,而且數量需要不少於可用CPU的個數。最消耗CPU資源的SSL操作是SSL握手,有兩種方法可以將每個用戶端的握手運算元量降到最低:
保持用戶端長串連,在一個SSL串連發送多個請求
在並發的串連或者後續的串連中重用SSL會話參數,這樣可以避免SSL握手操作。
會話緩衝用於儲存SSL會話,這些緩衝在背景工作處理序間共用,可以使用ssl_session_cache指令進行配置。1M緩衝可以存放約4000個會話。預設的緩衝逾時時間是5m,可以使用ssl_session_timeout加大它。
ssl_session_cache指令
文法:ssl_session_cache off|none|builtin:size|shared:name:size
使用環境:main,server
緩衝類型:
off -- 硬關閉,nginx明確告訴用戶端這個會話不可重用
none -- 軟關閉,nginx告訴用戶端工作階段能夠被重用,但是nginx實際上不會重用它們
bultin -- openssl內建緩衝,僅可用於一個背景工作處理序.可能導致記憶體片段
shared -- 所有背景工作處理序的共用快取。(1)緩衝大小用位元組數指定(2)每個緩衝必須擁有自己的名稱(3)同名的緩衝可用於多個虛擬機器主機
最佳化樣本
#最佳化ssl服務 ssl_session_cache shared:wzy:10m; #用戶端能夠重複使用儲存在緩衝中的會話參數時間 ssl_session_timeout 10m;
nginx強制使用https訪問(http跳轉到https)
基於nginx搭建了一個https訪問的虛擬機器主機,監聽的網域名稱是test.com,但是很多使用者不清楚https和http的區別,會很容易敲成http://test.com,這時會報出404錯誤,所以我需要做基於test.com網域名稱的http向https的強制跳轉
nginx的rewrite方法
思路
這應該是大家最容易想到的方法,將所有的http請求通過rewrite重寫到https上即可
配置
server { listen 192.168.1.111:80; server_name test.com; rewrite ^(.*)$ https://$host$1 permanent; }
搭建此虛擬機器主機完成後,就可以將http://test.com的請求全部重寫到https://test.com上了
nginx的497狀態代碼
error code 497 497 - normal request was sent to HTTPS
解釋:當此虛擬網站只允許https訪問時,當用http訪問時nginx會報出497錯誤碼
思路
利用error_page命令將497狀態代碼的連結重新導向到https://test.com這個網域名稱上
配置
server { listen 192.168.1.11:443; #ssl連接埠 listen 192.168.1.11:80; #使用者習慣用http訪問,加上80,後面通過497狀態代碼讓它自動跳到443連接埠 server_name test.com; #為一個server{......}開啟ssl支援 ssl on; #指定PEM格式的認證檔案 ssl_certificate /etc/nginx/test.pem; #指定PEM格式的私密金鑰檔案 ssl_certificate_key /etc/nginx/test.key; #讓http請求重新導向到https請求 error_page 497 https://$host$uri?$args; }
index.html重新整理網頁
思路
上述兩種方法均會耗費伺服器的資源,我們用curl訪問baidu.com試一下,看百度的公司是如何?baidu.com向www.baidu.com的跳轉
可以看到百度很巧妙的利用meta的重新整理作用,將baidu.com跳轉到www.baidu.com.因此我們可以基於http://test.com的虛擬機器主機路徑下也寫一個index.html,內容就是http向https的跳轉
index.html