NodeJs-通訊系統-https與openssl

來源:互聯網
上載者:User

標籤:傳輸   建立   網站   oca   也有   export   tar   請求   隨機   

https簡介

http傳輸是明文資料,通常連接埠80或者8080,https是SSL安全加密後的密文資料,通常連接埠443        (www.ayjs.net楊洋 )

在實際情境中,私密金鑰和公開金鑰都儲存在服務端,在伺服器與用戶端相互確定彼此身份之前,公開金鑰會傳送到用戶端,用戶端隨機發送訊息給伺服器端,伺服器端拿到收到的字元計算成Hash值後用私密金鑰加密再發送給用戶端;用戶端收到資料後用之前收到的公開金鑰解密,解密後,把之前隨機發出的訊息也計算成hash值,檢查是否一致;如果一致,那麼握手成功,用戶端選擇一個密碼編譯演算法和相應秘匙並用公開金鑰加密後,發送伺服器端;伺服器端接收到密碼編譯演算法和密匙後,也就可以正式溝通資料了

建立HTTPS伺服器openssl環境

手工編譯太難了,我表示失敗了3個小時,最終放棄。

下載我上傳的windows編譯後的: 百度雲

我拷貝到了c盤,並改了名字為openssl

如果使用openssl.exe使用方法,就只能

C:\openssl\bin\openssl.exe 其他命令

建立私密金鑰

windows版本: C:\openssl\bin\openssl.exe genrsa -out c://privatekey.pem 1024非windows的終端應該內建openssl命令了

openssl genrsa -out c://privatekey.pem 1024

那麼下面的我就直接用windows的來講了。

建立認證簽章要求

C:\openssl\bin\openssl.exe req -new -key c://privatekey.pem -out c://client.csr

然後輸入資訊,產生認證

擷取認證

認證應該是一個經過認證授證中心簽名的檔案,該認證檔案內包含了伺服器端提供的公開金鑰以及認證的辦法機構等資訊

C:\openssl\bin\openssl.exe x509 -req -in c://client.csr -signkey c://privatekey.pem -out  c://certificate.pem

建立pfx檔案

C:\openssl\bin\openssl.exe pkcs12 -export -in c://certificate.pem -inkey c://privatekey.pem -out c://certificate.pfx

在這些檔案,pfx檔案為可選用檔案,檔案都有了後,可以使用https模組中的createServer方法建立一個https伺服器

我兩次密碼都是123456

建立httpsDemo.js

/** * Created by aaronyang on 2015/10/30. */var https=require(‘https‘);var fs=require(‘fs‘);var privatekey=fs.readFileSync(‘c:/privatekey.pem‘);var pc=fs.readFileSync(‘c:/certificate.pem‘);var options={key:privatekey,cert:pc}var server=https.createServer(options, function (req,res) {console.log(req.url);if(req.url!==‘favicon.ico‘){res.setHeader(‘Content-Type‘,‘text/html‘);res.write(‘<html><head><meta charset="utf-8"/> </head>‘);res.write(‘hello ay!https服務‘);res.end();}})server.listen(1443,‘localhost‘, function () {console.log(‘伺服器開始監聽‘);})

:這裡注意1024以下的連接埠,需要管理員權限才能監聽

 

這裡的createServer方法相對於http多了個options參數,這個參數值太多了,我稍微列舉幾個

pfx指定pfx檔案讀取出來的公開金鑰以及認證。使用該屬性值後,不需要指定key、cert以及ca屬性值

passphrase用於為私密金鑰檔案或pfx檔案指定密碼。

* key指定從尾碼名為pem的私密金鑰檔案中讀取出來的私密金鑰。

cert:用於指定從尾碼名為pem的檔案中讀取出來的公開金鑰。必須指定,除非制定了pfx值

ca:為一個字串數組或一個buffer對象數組,用於指定一組認證,預設屬性值為幾個註明的認證授證中心,例如VerlSign

ciphers:屬性值為一個字串,用於描述需要使用或取消使用的密碼。為了阻止BEAST攻擊,推薦將ciphers屬性與honorCipherOrder屬性結合使用,以指定非CBC(Cipher-block chaining密碼分組連結)模式的密碼的優先順序,預設屬性值為AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH

requestCert:布爾值,預設false,為true的時候,伺服器在確認連結時要求用戶端提供認證。

還有handshakeTimeout,rejectUnauthorized,NPNProtocols,sessionIdContext

跟HTTP一樣,當然了也有close方法,error方法,這裡不列舉了,具體可以參考http的

HTTPS用戶端

在https模組中,可以使用request方法向其他使用HTTPS協議的網站請求資料。

https.request(options,callback)

其中options參數,跟createServer的參數是一樣的。

跟http的request差不過,都只不過多了個options參數

這裡講下options中的agent參數,用於指定使用者代理程式。在Nodejs中,使用https.Agent類代表一個使用者代理程式。在nodejs中,使用者代理程式預設在請求資料時使用keep-alive串連,同時使用一個全域的https.Agent對象。可以為agent屬性值顯式指定一個https.Agent對象,也可以通過將agent屬性值指定為false的方法從串連池中自動挑選一個當前串連狀態為關閉的https.Agent對下網

例如.

var opt1={hostname:‘npmjs.org‘,port:443,path:‘/‘,method:‘GET‘,agent:false}var req=https.request(opt1, function (res) {console.log(‘狀態代碼:‘ + res.statusCode);console.log(‘回應標頭:‘ + JSON.stringify(res.headers));res.setEncoding(‘utf8‘);res.on(‘data‘, function (data) {console.log(‘data:‘+data);})})

當然也有https.get方法

在建立串連的過程中,當為串連分配連接埠時候,觸發https.ClientRequest對象的socket事件。

下面是用戶端發送請求,1秒後伺服器沒反應,客戶就斷開請求abort

req.on(‘socket‘, function (socket) {    socket.setTimeout(1000);    socket.on(‘timeout‘, function () {        req.abort();    });})

req.on(‘error‘,function(err){})

具體的用法可以參考HTTP去編寫。

NodeJs-通訊系統-https與openssl

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.