nodejs配置微信小程序本地服務器(一):OpenSSL生成自簽名SSL證書

OpenSSL生成自簽名SSL證書

科普:TLS、SSL、HTTPS以及證書

很多人可能聽過其中的超過3個名詞,但它們究竟有什麼關聯呢?html

TLS 是傳輸層安全協議(Transport Layer Security)的縮寫,是一種對基於網絡的傳輸的加密協議,能夠在受信任的第三方公證基礎上作雙方的身份認證。TLS能夠用在TCP上,也能夠用在無鏈接的UDP報文上。協議規定了身份認證、算法協商、密鑰交換等的實現。
SSL 是TLS的前身,如今已再也不更新。
HTTPS 是在基於TLS/SSL的安全套接字上的的應用層協議,除了傳輸層進行了加密外,其它與常規HTTP協議基本保持一致
證書 是TLS協議中用來對身份進行驗證的機制,是一種數字簽名形式的文件,包含證書擁有者的公鑰及第三方的證書信息。
證書分爲2類: 自簽名證書和CA證書。通常自簽名證書不能用來進行身份認證,若是一個server端使用自簽名證書,client端要麼被設置爲無條件信任任何證書,要麼須要將自簽名證書的公鑰和私鑰加入受信任列表。但這樣一來就增長了server的私鑰泄露風險。
TLS基於CA的身份認證基本原理是:首先驗證方須要信任CA提供方本身的證書(CAcert),好比證書在操做系統的受信任證書列表中,或者用戶經過「安裝根證書」等方式將CA的公鑰和私鑰加入受信任列表;而後CA對被驗證方的原始證書進行簽名(私鑰加密),生成最終的證書;驗證方獲得最終的證書後,利用CAcert中包含的公鑰進行解密,獲得被驗證方的原始證書。
根據RSA的加密原理,若是用CA的公鑰解密成功,說明該證書的確是用CA的私鑰加密的,能夠認爲被驗證方是可信的。

微信小程序對第三方服務端的網絡通訊方式支持https和Websocket,WebSocket是HTML5開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議,解決了HTTP協議效率低下的問題,能更好的節省服務器資源和帶寬並達到實時通信。
這裏選擇使用node.js配置本地服務器,它有不少websocket庫,ws就是其中之一,號稱最輕量級,最快。ws的用法比較簡單,直接看https://github.com/websockets/ws就能夠。
這裏着重講的是針對微信小程序實現的加入ssl證書的websocket實現。
生產環境建議你去買一個ssl證書,開發環境你能夠給本身生成一個ssl自簽名證書臨時用一下。這裏的開發環境爲win7 X64系統node

1、安裝OpenSSL

下載連接:http://slproweb.com/products/Win32OpenSSL.html
這裏建議下載32位版本,由於window任何版本都能使用。git

!!!強烈建議下載v1.0.2的版本,千萬不要用v1.1.0及更新的版本,由於會出現已經bug:「problem creating object tsa_policy1=1.2.3.4.1」!
若是安裝過程出現這個窗口,說明你的電腦沒有安裝Visual C++ 2008 Redistributables, 請自行下載安裝。github

這裏寫圖片描述

剩下的安裝所有默認便可。我安裝在 D:OpenSSL-Win32 目錄下。在這裏我想將證書輸出到 D盤根目錄下,首先用管理員權限打開cmd(切記!!!)
而後進入D盤根目錄。在建立證書以前,你須要設置2個環境變量:web

  • set RANDFILE=D:\.rnd
  • set OPENSSL_CONF=D:OpenSSL-Win32binopenssl.cfg

第二句告訴系統去哪找openssl.cfg文件。
如今能夠運行OpenSSL了,cmd中輸入 D:OpenSSL-Win32binopenssl.exe運行。以上過程如圖:
這裏寫圖片描述算法

2、生成服務器證書

第一步:對於一個網站,首先必須有本身的私鑰。爲服務器建立一個1024位的RSA密鑰,並保存到ca.key文件中:

openssl genrsa -out ssl.key 1024

若是想要添加密碼保護,則改爲如下命令:小程序

openssl genrsa -des3 -out ssl.key 1024
利用私鑰就能夠生成證書了。OpenSSL使用 x509命令生成證書。這裏須要區分兩個概念: 證書(certificate)證書請求(certificate sign request)
證書是自簽名或CA簽名過的憑據,用來進行身份認證。
證書請求是對簽名的請求,須要使用私鑰進行簽名
x509命令能夠將證書和證書請求相互轉換,不過咱們這裏只用到從證書請求到證書的過程。

第二步:從私鑰或已加密的私鑰都可以生成"證書請求":

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

若是私鑰已加密,須要輸入密碼。req命令會經過命令行要求用戶輸入國家、地區、組織等信息,這些信息會附加在證書中展現給鏈接方。微信小程序

第三步:用私鑰對「證書請求」進行簽名生成證書crt。根據不一樣的場景,簽名的方式也略有不一樣:

(一)自簽名,生成私有證書

自簽名的原理是用私鑰對該私鑰生成的「證書請求」進行簽名,生成證書文件。該證書的簽發者就是本身,因此驗證方必須有該證書的私鑰才能對簽發信息進行驗證,因此要麼驗證方信任一切證書,面臨冒名頂替的風險,要麼被驗證方的私鑰(或加密過的私鑰)須要發送到驗證方手中,面臨私鑰泄露的風險。
固然自簽名也不是一無用處,好比須要內部通信的兩臺電腦須要使用加密又不想用第三方證書,能夠在兩端使用相同的私鑰和證書進行驗證(固然這樣就跟對稱加密沒有區別了)。自簽名的方法爲:安全

openssl x509 -req -in ssl.csr -signkey ssl.key -out ssl.crt
(二)自簽名,生成CA證書

CA證書是一種特殊的自簽名證書,能夠用來對其它證書進行簽名。這樣當驗證方選擇信任了CA證書,被簽名的其它證書就被信任了。在驗證方進行驗證時,CA證書來自操做系統的信任證書庫,或者指定的證書列表。服務器

openssl x509 -req -in sign.csr -extensions v3_ca -signkey sign.key -out sign.crt
(三)利用CA證書對其它證書進行簽名
openssl x509 -req -in ssl.csr -extensions v3_usr -CA sign.crt -CAkey sign.key -CAcreateserial -out ssl.crt

3、拓展知識

若是想將下屬CA密鑰用於受權碼簽名(經過Microsoft’s signtool工具),你必須把密鑰和證書打包進一個PKCS12文件。

pkcs12 -export -out ia.p12 -inkey ia.key -in ia.crt -chain -CAfile ca.crt

這裏寫圖片描述

若是在上一節中,你將根CA和下屬CA的Common Name設置成同樣了,那麼這一步你會獲得這樣的報錯:

Error self signed certificate getting chain.
error in pkcs12

在Window上用signtool給可執行文件簽名的方法:
「受信仰的根證書頒發機構」存儲區中安裝 ia.p12 文件(如:雙擊它),而後用signtool /wizard爲它簽名。

在上面你建立的證書(.crt文件)也能夠雙擊來查看和安裝它:
這裏寫圖片描述


歡迎加QQ羣交流:146202960
或點擊連接加入QQ羣聊:https://jq.qq.com/?_wv=1027&k...

相關文章
相關標籤/搜索