Nginx配置支持https協議-應用實踐

Nginx配置支持https協議-應用實踐

https簡介

HTTPS 是運行在 TLS/SSL 之上的 HTTP,與普通的 HTTP 相比,在數據傳輸的安全性上有很大的提高。html

TLS是傳輸層安全協議(Transport Layer Security)的縮寫,是一種對基於網絡的傳輸的加密協議,能夠在受信任的第三方公證基礎上作雙方的身份認證。TLS能夠用在TCP上,也能夠用在無鏈接的UDP報文上。協議規定了身份認證、算法協商、密鑰交換等的實現。node

SSL是TLS的前身,如今已再也不更新ios

證書是TLS協議中用來對身份進行驗證的機制,是一種數字簽名形式的文件,包含證書擁有者的公鑰及第三方的證書信息。nginx

證書分爲2類:自簽名證書和CA證書。通常自簽名證書不能用來進行身份認證,若是一個server端使用自簽名證書,client端要麼被設置爲無條件信任任何證書,要麼須要將自簽名證書的公鑰和私鑰加入受信任列表。但這樣一來就增長了server的私鑰泄露風險。git

https可以有效的防止流量劫持,對內容加密(中間者沒法直接查看原始內容)、身份認證、數據完整性(防止內容被第三方冒充或者篡改)web

openssl工具簡介

openSSL是一款功能強大的加密工具、咱們當中許多人已經在使用openSSL、用於建立RSA私鑰或證書籤名請求、不過、你可知道能夠使用openSSL來測試計算機速度?或者還能夠用它來對文件或消息進行加密。算法

openssl是一個開源程序的套件、這個套件有三個部分組成、
一是libcryto、這是一個具備通用功能的加密庫、裏面實現了衆多的加密庫、
二是libssl、這個是實現ssl機制的、他是用於實現TLS/SSL的功能、
三是openssl、是個多功能命令行工具、他能夠實現加密解密、甚至還能夠當CA來用、可讓你建立證書、吊銷證書瀏覽器

這裏咱們用openssl enc對一個文件進行加密看看:安全

openssl enc -des3 -a -salt -in /etc/fstab -out /tmp/fstab.cipher   加密
cat /tmp/fstab.cipher
openssl enc -d -des3 -a -salt -in /tmp/fstab.cipher -out/path/to/fstab.cipher   解密

一.用openssl生成相關文件

1.先生成私鑰key服務器

openssl genrsa -out ssl.key 2048

2.生成證書請求csr,其中days參數是證書有效期.

openssl req -new -key ssl.key -days 3650 -out ssl.csr

生成的ssl.csr就是證書請求了. 通常來講證書請求是發給公開的CA簽名, 但私有接口就不必去CA簽名了.

也可一鍵生成csr和key文件

openssl req -new -newkey rsa:2048 -sha256 -nodes -out test_com.csr -keyout test_com.key -subj "/C=CN/ST=Beijing/L=Beijing/O=website Inc./OU=Web Securi
ty/CN=*.test.com"

3.去CA機構,申請證書,須要將csr上傳給CA機構。CA會根據你的申請返回一個證書給你。此時你已經有了ssl通訊所須要的全部文件。目前有這麼多免費的CA機構,這裏就再也不贅述

4.若是要生成私有的證書,能夠直接用本身的私鑰簽名剛剛生成的證書請求:

openssl x509 -req -in ssl.csr -signkey ssl.key -out ssl.crt

至此已經獲得ssl所須要的crt,key,去nginx配置便可

二.nginx配置支持https

ssl on;
listen 443 ;
ssl_certificate   /etc/nginx/ssl/ssl.crt;
ssl_certificate_key  /etc/nginx/ssl/ssl.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;

至此,已經能夠使用https訪問你的網站了

生成更多的證書

不過若是須要籤更多證書請求或者要使用CA證書的話, 就須要本身生成私有CA證書:

openssl x509 -req -in ssl.csr -extensions v3_ca -signkey ssl.key -out sign.crt

用CA證書給本身的證書請求籤名:

openssl x509 -req -in ssl.csr -extensions v3_usr -CA sign.crt -CAkey ssl.key -CAcreateserial -days 3650 -out ssl.crt

客戶端信任證書

若是證書是私有證書, 客戶端要信任證書須要作一些操做. 若是是瀏覽器, 直接根據瀏覽器的步驟信任證書便可. 本人使用的是requests模塊, 信任證書須要在發起請求(get 或 post)時添加verify參數, 值爲證書的CA_BUNDLE. CA_BUNDLE能夠在服務器端生成, 不過要傳給客戶端比較麻煩. 本人直接使用firefox瀏覽器導出證書(x.509含鏈證書), 並在請求時添加便可:

requests.get('https://exaple.com', verify='ca.crt')

驗證客戶端請求

HTTPS雖然也有驗證客戶端證書的方式, 但爲每一個請求的客戶端配置證書比較麻煩, 且也不是全部服務器程序都支持驗證客戶端證書.

本人使用的驗證方式爲客戶端請求多添加一個參數, 參數值爲修改版的TOTP與MD5結合. 具體算法自行定義便可, 只要知足:

  1. 容許必定的時間偏差;
  2. 不容易被猜想出算法;
  3. 方便修改算法密鑰

參考

https://chroming.gitlab.io/2017/04/26/add_https_and_comfirm/
http://www.cnblogs.com/kyrios/p/tls-and-certificates.html
http://seanlook.com/2015/01/18/openssl-self-sign-ca/
http://blog.chinaunix.net/uid-12818265-id-2914434.html
https://imququ.com/post/letsencrypt-certificate.html
http://blog.csdn.net/napolunyishi/article/details/42425827
相關文章
相關標籤/搜索