Nginx + openssl 搭建https服務

      近期忙着和第三方短信公司對接短信上行接口。給予https和digest認證方式進行數據的傳輸。digest認證由前端phper進行實現,我需要完成nginx+ssl實現https服務。ssl使用openssl自己進行製作。

     

      SSL原理:

       給予SSL原理知識,在這裏不再過多闡述。想詳細瞭解,可以猛戳此鏈接進行查看:http://www.fenesky.com/blog/2014/07/19/how-https-works.html

     

      1.首先要生成服務器的私鑰:

       wKiom1TbDZCjATxOAALK2k4pqsk885.jpg


   運行時會提示輸入密碼,此密碼用於加密key文件(參數des3便是指加密算法,當然也可以選用其他你認爲安全的算法.),以後每當需讀取此文件(通過openssl提供的命令或API)都需輸入口令.如果覺得不方便,也可以去除這個口令,但一定要採取其他的保護措施!
    去除key文件口令的命令:

wKiom1TbDhzgHR-WAAEreICuOCg996.jpg

        執行這個命令之後,再啓動nginx時,就無需輸入密碼。


       2. 用server.key生成一個證書

    wKiom1TbDtuCj3UwAAcxfqdLijM830.jpg        生成的csr 文件交給CA機構簽名後,形成服務器自己的證書。按照提示,提供服務器證書的相關信息。

    3. 對客戶端也做同樣的命令生成key及csr文件

       wKiom1TbEjSTzodsAAIeRYmaXWg389.jpg


wKioL1TbFF7zQZ9ZAAX4jHipcOw634.jpg

   4. 生成CSR證書文件必須有CA 機構的簽名纔可以形成證書。這裏製作自己的CA生成一個key文件CA.key和一個根證書ca.crt

    wKiom1TbE_uCAzZhAAZmWNfyxGw424.jpg

   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進行文件簽名

 

wKioL1TbFljjPG6eAAMs1zw3ZQs957.jpg

     客戶端證書籤發:

wKioL1TbFuLjjhSnAAMvQs12OGQ585.jpg

  證書格式轉換:

    

#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 部署已經完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章