Node之HTTPS客户端
向其他網站請求數據
在Node.js中,也可以很輕松地向任何網站發送請求并讀取該網站的響應數據。在http模塊中,可以使用request方法向其他網站請求數據。
var req=http.request(options,callback)- options:為一個對象或字符串,用于指定請求的目標URL地址,如果參數值為一個字符串,將自動使用url模塊中的parse方法轉換為一個對象。在options參數值對象或使用parse方法轉換后的對象中,可以指定的屬性及屬性值如下
- host:用于指定域名或目標主機的IP地址,默認屬性值為“localhost”。
- hostname:用于指定域名或目標主機的IP地址,默認屬性值為“localhost”。如果hostname屬性值與host屬性值都被指定,優先使用hostname屬性值。
- port:用于指定目標服務器用于HTTP客戶端連接的端口號。
- localAddress:用于指定專用于網絡連接的本地接口。
- socketPath:用于指定目標Unix域端口。
- method:用于指定HTTP請求方式,默認屬性值為“GET”。
- path:用于指定請求路徑及查詢字符串,默認屬性值為“/”。
- headers:用于指定客戶端請求頭對象。
- auth:用于指定認證信息部分,例如“user:password”。
- agent:用于指定HTTP代理。在Node.js中,使用http.Agent類代表一個HTTP代理。所謂HTTP代理,就是一個代表通過HTTP向其他網站請求數據的瀏覽器或者代理服務器。在Node.js中,HTTP代理默認在請求數據時使用keep-alive連接,同時使用一個全局的http.Agent對象來實現所有HTTP客戶端請求。不使用agent屬性值時,默認使用該全局http.Agent對象。可以為agent屬性值顯式指定一個http.Agent對象(即用戶代理),也可以通過將agent屬性值指定為false的方法從連接池中自動挑選一個當前連接狀態為關閉的http.Agent對象(即用戶代理)。
- callback:指定當獲取到目標網站所返回的響應流時調用的回調函數。request方法返回一個http.ClientRequest對象,代表一個客戶端請求。function (response) {//回調函數代碼略 }
向目標網站發送數據
在使用了request方法后,可以使用http.ClientRequest對象的write方法向目標網站發送數據
request.write(chunk,[encoding])結束請求
request.end([chunk],[encoding])完整請求示例
var http = require('http'); var options = {hostname: 'www.microsoft.com',port: 80,path: '/',method: 'GET' }; var req = http.request(options,function(res) {console.log('狀態碼: ' + res.statusCode);console.log('響應頭: ' + JSON.stringify(res.headers));res.setEncoding('utf8');res.on('data', function (chunk) {console.log('響應內容: '+chunk);}); }); req.end();終止請求
可以使用http.ClientRequest對象的abort方法終止本次請求
request.abort設置請求端口超時時間
request.setTimeout(timeout,[callback])制作代理服務器
示例:
var http=require('http'); var url=require('url'); var server = http.createServer(function(sreq, sres) {var url_parts = url.parse(sreq.url);var opts = {host: 'www.amazon.cn',port: 80,path: url_parts.pathname,headers: sreq.headers};var creq = http.get(opts, function(cres) {sres.writeHead(cres.statusCode, cres.headers);cres.pipe(sres);});sreq.pipe(creq); }); server.listen(1337, '127.0.0.1');創建HTTPS服務器與客戶端
在Node.js中,提供了一個https模塊,專用于創建HTTPS服務器與客戶端。
HTTPS服務器與HTTP服務器的區別
- HTTPS服務器使用HTTPS協議,而HTTP服務器使用HTTP協議。
- HTTPS服務器需要向證書授證(Certificate Authority)中心申請證書,一般免費證書很少,需要交費。在少許對客戶端有要求的情況下,也會要求客戶端使用證書。
- HTTP服務器與客戶端之間傳輸的是明文數據,而HTTPS服務器與客戶端之間傳輸的是經過SSL安全加密后的密文數據。
- HTTP服務器通常使用80端口或8080端口,而HTTPS服務器使用的是443端口。
創建HTTPS服務器
在創建HTTPS服務器之前,服務器端首先需要創建公鑰、私鑰及證書,步驟如下
- 創建私鑰。可以使用openssl工具創建私鑰openssl genrsa -out privatekey.pem 1024
- 創建證書簽名請求(Certificate Signing Request)文件openssl req -new -key privatekey.pem -out certrequest.csr
- 獲取證書。證書應該是一個經過證書授證中心簽名的文件,該證書文件內包含了服務器端提供的公鑰以及證書的頒發機構等信息,可以使用openssl工具創建一個學習或測試用的證書openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem x509參數表示該證書符合國際電信聯盟制定的數字證書標準。
在客戶端與服務器端建立連接后,將首先確認證書的合法性。如果在服務器中使用學習或測試用證書,使用瀏覽器訪問該服務器時,瀏覽器中將顯示一個警告信息,警告用戶該證書不是一個經過證書授證中心簽名的證書。
在具備了證書文件之后,可以使用該證書文件創建一個pfx文件。所謂pfx文件,是指該文件內容必須符合公鑰加密技術12號標準(Public Key CryptographyStandards#12,PKCS#12)為存儲和傳輸用戶或服務器私鑰、公鑰和證書而指定的
格式。
在openssl工具中,可以使用如下所示的命令創建pfx文件。
openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx在這些文件(其中pfx文件為可選用文件)具備了之后,可以使用https模塊中的createServer方法創建一個HTTPS服務器
https.createServer(options,[requestListener])- options:為一個對象,用于指定創建HTTPS服務器時可以使用的各種選項,在該對象中可以使用的屬性及屬性值
- pfx:屬性值為一個字符串或一個Buffer對象,用于指定從pfx文件讀取出的私鑰、公鑰以及證書。使用該屬性值不需要指定key屬性值、cert屬性值以及ca屬性值。
- key:屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的私鑰文件中讀取出來的私鑰。該屬性值為必須指定屬性值,除非指定了pfx屬性值。
- passphrase:屬性值為一個字符串,用于為私鑰文件或pfx文件指定密碼。
- cert:屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的文件中讀取出來的公鑰。該屬性值為必須指定屬性值,除非指定了pfx屬性值。
- ca:屬性值為一個字符串數組或一個Buffer對象數組,用于指定一組證書,默認屬性值為幾個著名的證書授證中心,例如VerlSign。
- crl:屬性值為一個字符串或字符串數組,用于指定證書吊銷列表。
- ciphers:屬性值為一個字符串值,用于描述需要使用或取消使用的密碼。為了阻擋BEAST攻擊,推薦將ciphers屬性與honorCipherOrder屬性結合使用,以指定非CBC(Cipher-block chaining,密碼分組鏈接)模式的密碼的優先級,默認屬性值為AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH。
- handshakeTimeout:屬性值為一個整數,用于指定在多少秒內如果沒有完成客戶端與服務器之間的握手,則放棄本次連接。默認屬性值為120(秒)。當在指定時間內沒有完成握手時,將觸發HTTPS服務器的clientError事件。
- honorCipherOrder:屬性值為一個布爾值。當屬性值指定為true時,服務器將密碼列表發送給客戶端,由客戶端選擇密碼。盡管該屬性值默認為false,但仍推薦將該屬性值指定為true,以阻止BEAST攻擊。
- requestCert:屬性值為一個布爾值。當屬性值指定為true時,服務器在確認連接時要求客戶端提供證書。默認屬性值為false。
- rejectUnauthorized:屬性值為一個布爾值。如果屬性值為true,那么服務器拒絕任何不能提供服務器端所要求的證書的客戶端。只有當requestCert屬性值指定為true時,該屬性值才有效。默認屬性值為false。
- NPNProtocols:屬性值為一個數組或一個Buffer對象,用于指定服務器端所需使用的NPN協議(這些協議應該按照其優先級排序)。NPN(Next Protocol Negotiation)協議是一種用于指定服務器可以使用多種協議(包括HTTP、SPDY協議等)的協議。
- sessionIdContext:屬性值為一個字符串,用于指定服務器端session的唯一標識符。如果requestCert屬性值指定為true,那么默認屬性值為一個MD5散列值。如果requestCert屬性值指定為false,不提供默認屬性值。
- requestListener:為一個回調函數,用于指定當服務器端接收到客戶端請求時所需執行的處理function (request,response) {//回調函數代碼略 }
在創建了HTTPS服務器之后,我們需要指定該服務器所要監聽的地址(可以為一個IP地址,也可以為一個主機名)及端口,這時,我們可以使用該HTTPS服務器的listen方法
server.listen(port,[host],[backlog],[callback])關閉服務器
server.close();創建HTTPS客戶端
在https模塊中,可以使用request方法向其他使用HTTPS協議的網站請求數據。
var req=https.request(options,callback)- options:值為一個對象或字符串,用于指定請求的目標URL地址,如果該參數值為一個字符串,將自動使用url模塊中的parse方法轉換為一個對象。在options參數值對象或使用parse方法轉換后
的對象中,可以指定的屬性及屬性值- host:用于指定域名或目標主機的IP地址,默認屬性值為“localhost”。
- hostname:指定域名或目標主機的IP地址,默認屬性值為“localhost”。如果hostname屬性值與host屬性值都被指定,優先使用hostname屬性值。
- port:指定目標服務器用于HTTP客戶端連接的端口號,默認屬性值為443。
- method:用于指定HTTP請求方式,默認屬性值為“GET”。
- path:用于指定請求路徑及查詢字符串,默認屬性值為“/”。
- headers:用于指定客戶端請求頭對象
- auth:用于指定認證信息部分,例如“user:password”。
- agent:用于指定用戶代理。在Node.js中,使用https.Agent類代表一個用戶代理。在Node.js中,用戶代理默認在請求數據時使用keep-alive連接,同時使用一個全局的https.Agent對象來實現所有HTTPS客戶端請求。不使用agent屬性值時,默認使用該全局https.Agent對象。可以為agent屬性值顯式指定一個https.Agent對象(即用戶代理),也可以通過將agent屬性值指定為false的方法從連接池中自動挑選一個當前連接狀態為關閉的https.Agent對象(即用戶代理)。
當在options參數值對象中使用如下所示的屬性及屬性值時,不能使用全局https.Agent對象。
- pfx:屬性值為一個字符串或一個Buffer對象,用于指定從pfx文件讀取出的私鑰、公鑰及證書。使用該屬性值不需要指定key屬性值、cert屬性值及ca屬性值。
- key:屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的私鑰文件中讀取出來的私鑰。該屬性值為必須指定屬性值,除非指定了pfx屬性值。
- passphrase:屬性值為一個字符串,用于為私鑰文件或pfx文件指定密碼。
- cert:屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的文件中讀取出來的符合X509標準的公鑰。該屬性值為必須指定屬性值,除非指定了pfx屬性值。
- ca:屬性值為一個字符串數組或一個Buffer對象數組,用于指定一組證書。
- ciphers:屬性值為一個字符串值,用于描述需要使用或取消使用的密碼。
- rejectUnauthorized:屬性值為一個布爾值。如果屬性值為true,服務器在客戶端建立連接后,返回響應前首先驗證客戶端提交的證書,如果驗證失敗,觸發客戶端請求對象的error事件。
總結
以上是生活随笔為你收集整理的Node之HTTPS客户端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构四双向链表
- 下一篇: 第七季2:MP4v2库的移植与播放实战