近期忙着和第三方短信公司對接短信上行接口。給予https和digest認證方式進行數據的傳輸。digest認證由前端phper進行實現,我須要完成nginx+ssl實現https服務。ssl使用openssl本身進行製做。php
SSL原理:
html
給予SSL原理知識,在這裏再也不過多闡述。想詳細瞭解,能夠猛戳此連接進行查看:http://www.fenesky.com/blog/2014/07/19/how-https-works.html
前端
1.首先要生成服務器的私鑰:python
運行時會提示輸入密碼,此密碼用於加密key文件(參數des3即是指加密算法,固然也能夠選用其餘你認爲安全的算法.),之後每當需讀取此文件(經過openssl提供的命令或API)都需輸入口令.若是以爲不方便,也能夠去除這個口令,但必定要採起其餘的保護措施! 去除key文件口令的命令:
執行這個命令以後,再啓動nginx時,就無需輸入密碼。nginx
2. 用server.key生成一個證書算法
生成的csr 文件交給CA機構簽名後,造成服務器本身的證書。按照提示,提供服務器證書的相關信息。windows
3. 對客戶端也作一樣的命令生成key及csr文件
api
4. 生成CSR證書文件必須有CA 機構的簽名才能夠造成證書。這裏製做本身的CA生成一個key文件CA.key和一個根證書ca.crt
瀏覽器
5. 建立openssl.conf 生成的配置文件安全
#根據openssl.cnf生成配置文件 touch /etc/pki/CA/{index.txt,serial} #設置副本名稱開始內容 echo 01 > /etc/pki/CA/serial #設置副本證書存放目錄 mkdir /etc/pki/CA/newcerts
6. 用CA的證書爲剛纔生成的server.csr 和 client.csr進行文件簽名
客戶端證書籤發:
證書格式轉換:
#IE瀏覽器須要p12證書,因此須要簽發p12證書,用於IE簽發: openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 #IOS 證書籤發格式 openssl x509 -in client.crt -out client.cer #Android 證書籤發格式 openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx #pem格式證書 openssl pkcs12 -export -in ddmdd_a.pfx -out client.pem
刪除私鑰密碼:
#刪除私鑰密碼 openssl rsa -in client.key -out client_open.key
證書撤銷:
echo 01 > crlnumber openssl ca -keyfile ca.key -cert ca.crt -revoke client.crt #從CA中撤銷證書client.crt openssl ca -gencrl -keyfile ca.key -cert ca.crt -out client.crl #生成或更新撤銷列表
查看證書信息:
openssl x509 -in client.pem -noout -text
client 瀏覽器須要使用的文件: ca.crt,client.crt,client.key,client.pfx
server 端使用的文件有: ca.crt, server.crt,server.key
7. 配置Nginx SSL
server { listen 443 ssl; server_name smsapi.chunbo.com; root /var/www/smsapi.david.com; ssl on; ssl_certificate /etc/nginx/conf.d/server.crt; ssl_certificate_key /etc/nginx/conf.d/server.key; ssl_client_certificate /etc/nginx/conf.d/ca.crt; ssl_verify_client off; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { index index.php index.html; } location ~ \.php$ { include /etc/nginx/fastcgi_params; if (-f $request_filename) { fastcgi_pass 127.0.0.1:9000; } fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } #nginx 配置完成,reloadNginx服務
8.客戶端導入證書
證書安裝及使用把剛纔生成的證書: 根證書ca.crt和客戶端client.crt(client.pfx)安裝到客戶端,ca.crt 安裝到信任的機構,client.crt直接在windows 安裝或安裝到我的證書位置。(若是是IE瀏覽器,須要安裝client.pfx證書,在導入的時候須要輸入證書籤發的密碼)
9. 測試
接下來就能夠經過瀏覽器進行測試。有的時候可能會做爲一個API接口提供其它程序進行調用,好比我使用python requests進行調用:
import requests responseObj = requests.get(' cert=('/path/client.crt', '/path/client.key' ) ) data = responseObj.text 或: responseObj = requests.get(' verify='/path/client.pem') data = responseObj.text
若是是JAVA程序,須要P12格式證書。根據本身的需求進行選擇。
給予Nginx+openssl 部署已經完成。