標籤:傳輸 建立 網站 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