http傳輸是明文數據,一般端口80或者8080,https是SSL安全加密後的密文數據,一般端口443 (www.ayjs.net楊洋 )javascript
在實際場景中,私鑰和公鑰都保存在服務端,在服務器與客戶端相互肯定彼此身份以前,公鑰會傳送到客戶端,客戶端隨機發送消息給服務器端,服務器端拿到收到的字符計算成Hash值後用私鑰加密再發送給客戶端;客戶端收到數據後用以前收到的公鑰解密,解密後,把以前隨機發出的消息也計算成hash值,檢查是否一致;若是一致,那麼握手成功,客戶端選擇一個加密算法和相應祕匙並用公鑰加密後,發送服務器端;服務器端接收到加密算法和密匙後,也就能夠正式溝通數據了html
手工編譯太難了,我表示失敗了3個小時,最終放棄。java
下載我上傳的windows編譯後的: 百度雲node
我拷貝到了c盤,並改了名字爲openssl算法
若是使用openssl.exe使用方法,就只能npm
C:\openssl\bin\openssl.exe 其餘命令windows
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
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模塊中,可使用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去編寫。