node的HTTPS模塊接口與HTTP其實差不多,就是多了一個認證證書,私鑰的配置等等,API都相似的。
在客戶端服務器通信的方法中,只有HTTPS是最安全的,它的原理是客戶端和服務器發送自己的公鑰,分別加密,然后解密傳輸的數據對比,為了防止重放攻擊,還會添加隨機數或者客戶端IP等信息,IP造假太容易了,大部分都是隨機數加時間什么什么的。HTTPS就是在HTTP與TCP之間添加了一個加密ssl/tls層。
類https.Server();//該類是tls.Server的子類,並發生和http.Server已有的事件。
server.setTimeout(msecs,cb)
server.timeout()
https.createServer(options,[requestListener]);//返回一個新的HTTPS Web服務器對象。其中options類似於tls.createServer();
//requestListener是一個會被自動添加到request事件的函數。
https.createServer(options,function(req,res){ res.writeHead(200); res.end('hello') }).listen(9000);
server.listen(port,[host],[backlog],[cb])
server.listen(path,[cb]);
server.listen(handle,[cb]);//見http.listen
server.close([cb]);
https.request(options,cb);//向一個安全web服務器發送請求,options可以是一個對象或字符串。如果options是字符串,會url.parse()解析;
//所有來自hhtp.request()的選項都是經過驗證的;
https.get(options,cb)
https.Agent
https.globalAgent//所有HTTPS客戶端請求的全局https.Agent實例;
var https = require('https'); var fs = require('fs'); var options = { key: fs.readFileSync('./keys/server.key'), cert: fs.readFileSync('./keys/server.crt') }; https.createServer(options, function (req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000);
和http主要差別就在key和cert上。
HTTPS的客戶端
var https = require('https'); var fs = require('fs'); var options = { hostname: 'localhost', port: 8000, path: '/', method: 'GET', key: fs.readFileSync('./keys/client.key'), cert: fs.readFileSync('./keys/client.crt'), ca: [fs.readFileSync('./keys/ca.crt')] }; options.agent = new https.Agent(options); var req = https.request(options, function(res) { res.setEncoding('utf-8'); res.on('data', function(d) { console.log(d); }); }); req.end(); req.on('error', function(e) { console.log(e); });
這里是創建私鑰,證書的代碼,因為node的tls/ssl都是基於openssl的,所以直接用openssl生成。
// 創建私 $ openssl genrsa -out client.key 1024 // 生成CSR $ openssl req -new -key client.key -out client.csr // 生成名證 $ openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
跟tls模塊生成是一樣的。