通過require('tls')
來使用這個(gè)模塊。
tls
模塊使用OpenSSL來提供傳輸層的安全 和/或 安全socket
層:已加密的流通信。
TLS/SSL是一種公/私鑰架構(gòu)。每個(gè)客戶端和每個(gè)服務(wù)器都必須有一個(gè)私鑰。一個(gè)私鑰通過像如下的方式創(chuàng)建:
openssl genrsa -out ryans-key.pem 2048
所有的服務(wù)器和部分的客戶端需要一個(gè)證書。證書是被CA簽名或自簽名的公鑰。獲取一個(gè)證書第一步是創(chuàng)建一個(gè)“證書簽署請(qǐng)求(Certificate Signing Request)”(CSR)文件。通過:
openssl req -new -sha256 -key ryans-key.pem -out ryans-csr.pem
要通過CSR創(chuàng)建一個(gè)自簽名證書,通過:
openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem
另外,你也可以把CSR交給一個(gè)CA請(qǐng)求簽名。
為了完全向前保密(PFS),需要產(chǎn)生一個(gè) 迪菲-赫爾曼 參數(shù):
openssl dhparam -outform PEM -out dhparam.pem 2048
創(chuàng)建.pfx
或.p12
,通過:
openssl pkcs12 -export -in agent5-cert.pem -inkey agent5-key.pem \
-certfile ca-cert.pem -out agent5.pfx
CA certs
串聯(lián)在一個(gè)文件中,就像cat ca1-cert.pem ca2-cert.pem > ca-cert.pem
。TLS協(xié)議讓客戶端可以重新協(xié)商某些部分的TLS會(huì)話。不幸的是,會(huì)話重協(xié)商需要不相稱的服務(wù)器端資源,這它可能成為潛在的DOS攻擊。
為了減緩這種情況,重新協(xié)商被限制在了每10分鐘最多3次。當(dāng)超過閥值時(shí),tls.TLSSocket
會(huì)觸發(fā)一個(gè)錯(cuò)誤。閥值是可以調(diào)整的:
tls.CLIENT_RENEG_LIMIT: 重新協(xié)商限制,默認(rèn)為3
。
tls.CLIENT_RENEG_WINDOW: 重新協(xié)商窗口(秒),默認(rèn)為10分鐘。
除非你知道你在做什么,否則不要改變默認(rèn)值。
為了測(cè)試你的服務(wù)器,使用openssl s_client -connect address:port
來連接它,然后鍵入R<CR>
(字母R
加回車)多次。
NPN
(下個(gè)協(xié)議協(xié)商)和SNI(服務(wù)器名稱指示)都是TLS握手拓展,它們?cè)试S你:
術(shù)語“向前保密”或“完全向前保密”描述了一個(gè)密鑰-協(xié)商(如密鑰-交換)方法的特性。事實(shí)上,它意味著,甚至是當(dāng)(你的)服務(wù)器的私鑰被竊取了,竊取者也只能在他成功獲得所有會(huì)話產(chǎn)生的密鑰對(duì)時(shí),才能解碼信息。
它通過在每次握手中(而不是所有的會(huì)話都是同樣的密鑰)隨機(jī)地產(chǎn)生用于密鑰-協(xié)商的密鑰對(duì)來實(shí)現(xiàn)。實(shí)現(xiàn)了這個(gè)技術(shù)的方法被稱作“ephemeral”。
目前有兩種普遍的方法來實(shí)現(xiàn)完全向前保密:
ephemeral
版本。ephemeral
版本。ephemeral
方法可能有一些性能問題,因?yàn)槊荑€的生成是昂貴的。
返回支持的SSL加密器的名字?jǐn)?shù)組。
例子:
var ciphers = tls.getCiphers();
console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...]
創(chuàng)一個(gè)新的tls.Server
實(shí)例。connectionListener
參數(shù)被自動(dòng)添加為secureConnection
事件的監(jiān)聽器。options
參數(shù)可以有以下屬性:
pfx: 一個(gè)包含PFX
或PKCS12
格式的私鑰,加密憑證和CA證書的字符串或buffer
。
key: 一個(gè)帶著PEM
加密私鑰的字符串(可以是密鑰數(shù)組)(必選)。
passphrase: 一個(gè)私鑰或pfx
密碼字符串。
cert: 一個(gè)包含了PEM
格式的服務(wù)器證書密鑰的字符串或buffer
(可以是cert
數(shù)組)(必選)。
ca: 一個(gè)PEM
格式的受信任證書的字符串或buffer
數(shù)組。如果它被忽略,將使用一些眾所周知的“根”CA,像VeriSign
。這些被用來授權(quán)連接。
crl : 一個(gè)PEM
編碼的證書撤銷列表(Certificate Revocation List)字符串或字符串列表。
ciphers: 一個(gè)描述要使用或排除的加密器的字符串,通過:
分割。默認(rèn)的加密器套件是:
ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES128-GCM-SHA256:
ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-AES256-GCM-SHA384:
DHE-RSA-AES128-GCM-SHA256:
ECDHE-RSA-AES128-SHA256:
DHE-RSA-AES128-SHA256:
ECDHE-RSA-AES256-SHA384:
DHE-RSA-AES256-SHA384:
ECDHE-RSA-AES256-SHA256:
DHE-RSA-AES256-SHA256:
HIGH:
!aNULL:
!eNULL:
!EXPORT:
!DES:
!RC4:
!MD5:
!PSK:
!SRP:
!CAMELLIA
默認(rèn)的加密器套件更傾向于Chrome's 'modern cryptography' setting
的GCM加密器,也傾向于PFC的ECDHE和DHE加密器,它們提供了一些向后兼容性。
鑒于specific attacks affecting larger AES key sizes
,所以更傾向于使用128位的AES而不是192和256位的AES。
舊的依賴于不安全的和棄用的RC4或基于DES的加密器(像IE6)的客戶端將不能完成默認(rèn)配置下的握手。如果你必須支持這些客戶端,TLS推薦規(guī)范
可能提供了一個(gè)兼容的加密器套件。更多格式細(xì)節(jié),參閱OpenSSL cipher list format documentation
。
ECDH
密鑰協(xié)商的已命名的橢圓的字符串,如果要禁用ECDH
,就設(shè)置為false
。默認(rèn)值為prime256v1
(NIST P-256)。使用crypto.getCurves()
來獲取一個(gè)可用的橢圓列表。在最近的發(fā)行版中,運(yùn)行openssl ecparam -list_curves
命令也會(huì)展示所有可用的橢圓的名字和描述。
dhparam: 一個(gè)包含了迪菲-赫爾曼參數(shù)的字符串或buffer
,要求有完全向前保密。使用openssl dhparam
來創(chuàng)建它。它的密鑰長(zhǎng)度需要大于等于1024字節(jié),否則會(huì)拋出一個(gè)錯(cuò)誤。強(qiáng)力推薦使用2048或更多位,來獲取更高的安全性。如果參數(shù)被忽略或不合法,它會(huì)被默默丟棄并且DHE
加密器將不可用。
handshakeTimeout: 當(dāng)SSL/TLS握手在這個(gè)指定的毫秒數(shù)后沒有完成時(shí),終止這個(gè)鏈接。默認(rèn)為120秒。
當(dāng)握手超時(shí)時(shí),tls.Server
會(huì)觸發(fā)一個(gè)clientError
事件。
honorCipherOrder : 選擇一個(gè)加密器時(shí),使用使用服務(wù)器的首選項(xiàng)而不是客戶端的首選項(xiàng)。默認(rèn)為true
。
requestCert: 如果設(shè)置為true
,服務(wù)器將會(huì)向連接的客戶端請(qǐng)求一個(gè)證書,并且試圖驗(yàn)證這個(gè)證書。默認(rèn)為true
。
rejectUnauthorized: 如果設(shè)置為true
,服務(wù)器會(huì)拒絕所有沒有在提供的CA列表中被授權(quán)的客戶端。只有在requestCert
為true
時(shí)這個(gè)選項(xiàng)才有效。默認(rèn)為false
。
NPNProtocols: 一個(gè)可用的NPN
協(xié)議的字符串或數(shù)組(協(xié)議應(yīng)該由它們的優(yōu)先級(jí)被排序)。
SNICallback(servername, cb): 當(dāng)客戶端支持SNI TLS
擴(kuò)展時(shí),這個(gè)函數(shù)會(huì)被調(diào)用。這個(gè)函數(shù)會(huì)被傳遞兩個(gè)參數(shù):servername和cb。SNICallback
必須執(zhí)行cb(null, ctx)
,ctx
是一個(gè)SecureContext
實(shí)例(你可以使用tls.createSecureContext(...)
來獲取合適的SecureContext
)。如果SNICallback
沒有被提供 - 默認(rèn)的有高層次API的回調(diào)函數(shù)會(huì)被使用(參閱下文)。
sessionTimeout: 一個(gè)指定在TLS會(huì)話標(biāo)識(shí)符和TLS會(huì)話門票(tickets)被服務(wù)器創(chuàng)建后的超時(shí)時(shí)間。更多詳情參閱SSL_CTX_set_timeout
。
ticketKeys: 一個(gè)由16字節(jié)前綴,16字節(jié)hmac密鑰,16字節(jié)AEC密鑰組成的48字節(jié)buffer
。你可以使用它在不同的tls
服務(wù)器實(shí)例上接受tls
會(huì)話門票。
注意:會(huì)在cluster
模塊工作進(jìn)程間自動(dòng)共享。
sessionIdContext: 一個(gè)包含了會(huì)話恢復(fù)標(biāo)識(shí)符的字符串。如果requestCert
為true
,默認(rèn)值是通過命令行生成的MD5哈希值。否則,就將不提供默認(rèn)值。
secureProtocol: 將要使用的SSL方法,舉例,SSLv3_method
將強(qiáng)制使用SSL v3??捎玫闹等Q于OpenSSL的安裝和SSL_METHODS
常量中被定義的值。
下面是一個(gè)簡(jiǎn)單應(yīng)答服務(wù)器的例子:
var tls = require('tls');
var fs = require('fs');
var options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
// This is necessary only if using the client certificate authentication.
requestCert: true,
// This is necessary only if the client uses the self-signed certificate.
ca: [ fs.readFileSync('client-cert.pem') ]
};
var server = tls.createServer(options, function(socket) {
console.log('server connected',
socket.authorized ? 'authorized' : 'unauthorized');
socket.write("welcome!\n");
socket.setEncoding('utf8');
socket.pipe(socket);
});
server.listen(8000, function() {
console.log('server bound');
});
或
var tls = require('tls');
var fs = require('fs');
var options = {
pfx: fs.readFileSync('server.pfx'),
// This is necessary only if using the client certificate authentication.
requestCert: true,
};
var server = tls.createServer(options, function(socket) {
console.log('server connected',
socket.authorized ? 'authorized' : 'unauthorized');
socket.write("welcome!\n");
socket.setEncoding('utf8');
socket.pipe(socket);
});
server.listen(8000, function() {
console.log('server bound');
});
你可以通過openssl s_client
來連接服務(wù)器:
openssl s_client -connect 127.0.0.1:8000
根據(jù)給定的 端口和主機(jī)(舊API)或 options.port
和options.host
創(chuàng)建一個(gè)新的客戶端連接。如果忽略了主機(jī),默認(rèn)為localhost
。options
可是一個(gè)含有以下屬性的對(duì)象:
host: 客戶端應(yīng)該連接到的主機(jī)。
port: 客戶端應(yīng)該連接到的端口。
socket: 根據(jù)給定的socket
的來建立安全連接,而不是創(chuàng)建一個(gè)新的socket
。如果這個(gè)選項(xiàng)被指定,host
和port
會(huì)被忽略。
path: 創(chuàng)建到path
的unix socket
連接。如果這個(gè)選項(xiàng)被指定,host
和port
會(huì)被忽略。
pfx: 一個(gè)PFX
或PKCS12
格式的包含了私鑰,證書和CA證書的字符串或buffer
。
key: 一個(gè)PEM
格式的包含了客戶端私鑰的字符串或buffer
(可以是密鑰的數(shù)組)。
passphrase: 私鑰或pfx
的密碼字符串。
cert: 一個(gè)PEM
格式的包含了證書密鑰的字符串或buffer
(可以是密鑰的數(shù)組)。
ca: 一個(gè)PEM
格式的受信任證書的字符串或buffer
數(shù)組。如果它被忽略,將使用一些眾所周知的CA,像VeriSign
。這些被用來授權(quán)連接。
ciphers: 一個(gè)描述了要使用或排除的加密器,由:
分割。使用的默認(rèn)加密器套件與tls.createServer
使用的一樣。
rejectUnauthorized: 若被設(shè)置為true
,會(huì)根據(jù)提供的CA列表來驗(yàn)證服務(wù)器證書。當(dāng)驗(yàn)證失敗時(shí),會(huì)觸發(fā)error
事件;err.code
包含了一個(gè)OpenSSL錯(cuò)誤碼。默認(rèn)為true
。
NPNProtocols: 包含支持的NPN協(xié)議的字符串或buffer
數(shù)組。buffer
必須有以下格式:0x05hello0x05world
,第一個(gè)字節(jié)是下一個(gè)協(xié)議名的長(zhǎng)度(傳遞數(shù)組會(huì)更簡(jiǎn)單:['hello', 'world']
)。
servername: SNI
TLS 擴(kuò)展的服務(wù)器名。
checkServerIdentity(servername, cert): 為根據(jù)證書的服務(wù)器主機(jī)名檢查提供了覆蓋。必須在驗(yàn)證失敗時(shí)返回一個(gè)錯(cuò)誤,驗(yàn)證通過時(shí)返回undefined
。
secureProtocol: 將要使用的SSL方法,舉例,SSLv3_method
將強(qiáng)制使用SSL v3??捎玫闹等Q于OpenSSL的安裝和SSL_METHODS
常量中被定義的值。
session: 一個(gè)Buffer
實(shí)例,包含了TLS會(huì)話。
callback
參數(shù)會(huì)被自動(dòng)添加為secureConnect
事件的監(jiān)聽器。
tls.connect()
返回一個(gè)tls.TLSSocket
對(duì)象。
以下是一個(gè)上述應(yīng)答服務(wù)器的客戶端的例子:
var tls = require('tls');
var fs = require('fs');
var options = {
// These are necessary only if using the client certificate authentication
key: fs.readFileSync('client-key.pem'),
cert: fs.readFileSync('client-cert.pem'),
// This is necessary only if the server uses the self-signed certificate
ca: [ fs.readFileSync('server-cert.pem') ]
};
var socket = tls.connect(8000, options, function() {
console.log('client connected',
socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', function(data) {
console.log(data);
});
socket.on('end', function() {
server.close();
});
或
var tls = require('tls');
var fs = require('fs');
var options = {
pfx: fs.readFileSync('client.pfx')
};
var socket = tls.connect(8000, options, function() {
console.log('client connected',
socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', function(data) {
console.log(data);
});
socket.on('end', function() {
server.close();
});
net.Socket
實(shí)例的包裝,替換了內(nèi)部socket
的 讀/寫例程,來提供透明的對(duì) 傳入/傳出數(shù)據(jù) 的 加密/解密。
根據(jù)已存在的TCPsocket
,構(gòu)造一個(gè)新的TLSSocket
對(duì)象。
socket
是一個(gè)net.Socket
實(shí)例。
options
是一個(gè)可能包含以下屬性的對(duì)象:
secureContext: 一個(gè)可選的通過tls.createSecureContext( ... )
得到的TLS內(nèi)容對(duì)象。
isServer: 如果為true
,TLS socket
將會(huì)在服務(wù)器模式(server-mode)下被初始化。
server: 一個(gè)可選的net.Server
實(shí)例。
requestCert: 可選,參閱tls.createSecurePair
。
rejectUnauthorized: 可選,參閱tls.createSecurePair
。
NPNProtocols: 可選,參閱tls.createServer
。
SNICallback: 可選,參閱tls.createServer
。
session: 可選,一個(gè)Buffer
實(shí)例,包含了TLS會(huì)話。
requestOCSP: 可選,如果為true
,OCSP
狀態(tài)請(qǐng)求擴(kuò)展將會(huì)被添加到客戶端 hello,并且OCSPResponse
事件將會(huì)在建立安全通信前,于socket
上觸發(fā)。
創(chuàng)建一個(gè)證書對(duì)象,details
有可選的以下值:
PFX
或PKCS12
編碼的私鑰,證書和CA證書的字符串或buffer
。PEM
編碼的私鑰的字符串。pfx
密碼字符串。PEM
加密證書的字符串。PEM
加密CA證書的字符串或字符串列表。PEM
加密CRL
的字符串或字符串列表。http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT
。true
。更多細(xì)節(jié)參閱tls
模塊文檔。如果沒有指定ca
,那么io.js
將會(huì)使用http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt
提供的默認(rèn)公共可信任CA列表。
根據(jù)兩個(gè)流,創(chuàng)建一個(gè)新的安全對(duì)(secure pair)對(duì)象,一個(gè)是用來讀/寫加密數(shù)據(jù),另一個(gè)是用來讀/寫明文數(shù)據(jù)。通常加密的數(shù)據(jù)是從加密數(shù)據(jù)流被導(dǎo)流而來,明文數(shù)據(jù)被用來作為初始加密流的一個(gè)替代。
credentials: 一個(gè)通過tls.createSecureContext( ... )
得到的安全內(nèi)容對(duì)象。
isServer: 一個(gè)表明了 是否這個(gè)tls
連接應(yīng)被作為一個(gè)服務(wù)器或一個(gè)客戶端打開 的布爾值。
requestCert: 一個(gè)表明了 是否服務(wù)器應(yīng)該向連接的客戶端請(qǐng)求證書 的布爾值。只應(yīng)用于服務(wù)器連接。
rejectUnauthorized: 一個(gè)表明了 是否服務(wù)器應(yīng)該拒絕包含不可用證書的客戶端 的布爾值。只應(yīng)用于啟用了requestCert
的服務(wù)器。
tls.createSecurePair()
返回一個(gè)帶有cleartext
和 encrypted
流 屬性的對(duì)象。
注意:cleartext
和tls.TLSSocket
有相同的API。
由tls.createSecurePair
返回。
當(dāng)SecurePair
成功建立一個(gè)安全連接時(shí),SecurePair
會(huì)觸發(fā)這個(gè)事件
與檢查服務(wù)器的secureConnection
事件相似,pair.cleartext.authorized
必須被檢查,來確認(rèn)證書是否使用了合適的授權(quán)。
這是一個(gè)net.Server
的子類,并且與其有相同的方法。除了只接受源TCP連接,這個(gè)類還接受通過TLS或SSL加密的數(shù)據(jù)。
當(dāng)一個(gè)新連接被成功握手后,這個(gè)事件會(huì)被觸發(fā)。參數(shù)是一個(gè)tls.TLSSocket
實(shí)例。它擁有所有普通流擁有的事件和方法。
socket.authorized
是一個(gè)表明了 客戶端是否通過提供的服務(wù)器CA來進(jìn)行了認(rèn)證 的布爾值。如果socket.authorized
為false
,那么socket.authorizationError
將被設(shè)置用來描述授權(quán)失敗的原因。一個(gè)不明顯的但是值得提出的點(diǎn):依靠TLS服務(wù)器的設(shè)定,未授權(quán)的連接可能會(huì)被接受。socket.npnProtocol
是一個(gè)包含了被選擇的NPN協(xié)議的字符串。socket.servernam
是一個(gè)包含了通過SNI請(qǐng)求的服務(wù)器名的字符串。
當(dāng)安全連接被建立之前,服務(wù)器觸發(fā)了一個(gè)error
事件 - 它會(huì)被轉(zhuǎn)發(fā)到這里。
tlsSocket
是錯(cuò)誤來自的tls.TLSSocket
。
在TLS會(huì)話創(chuàng)建時(shí)觸發(fā)。可能會(huì)被用來在外部存儲(chǔ)會(huì)話。callback
必須最終被執(zhí)行,否則安全連接將不會(huì)收到數(shù)據(jù)。
注意:這個(gè)事件監(jiān)聽器只會(huì)影響到它被添加之后建立的連接。
當(dāng)客戶端想要恢復(fù)先前的TLS會(huì)話時(shí)觸發(fā)。事件監(jiān)聽器可能會(huì)在外部通過sessionId
來尋找會(huì)話,并且在結(jié)束后調(diào)用callback(null, sessionData)
。如果會(huì)話不能被恢復(fù)(例如沒有找到),可能會(huì)調(diào)用callback(null, null)
。調(diào)用callback(err)
會(huì)關(guān)閉將要到來的連接并且銷毀socket
。
注意:這個(gè)事件監(jiān)聽器只會(huì)影響到它被添加之后建立的連接。
當(dāng)客戶端發(fā)送一個(gè)證書狀態(tài)請(qǐng)求時(shí)觸發(fā)。你可以解釋服務(wù)器當(dāng)前的證書來獲取OCSP url和證書id,并且在獲取了OCSP響應(yīng)后執(zhí)行callback(null, resp)
,resp
是一個(gè)Buffer
實(shí)例。certificate
和issuer
都是一個(gè)Buffer
,即主鍵和發(fā)起人證書的DER代表(DER-representations)。它們可以被用來獲取OCSP證書id 和 OCSP末端url。
另外,callback(null, null)
可以被調(diào)用,意味著沒有OCSP響應(yīng)。
調(diào)用callback(err)
,將會(huì)導(dǎo)致調(diào)用socket.destroy(err)
。
典型的流程:
OCSPRequest
給它(通過ClientHello
中擴(kuò)展的狀態(tài)信息)。OCSPRequest
事件監(jiān)聽器(如果存在)。OCSPResponse
,然后通過回調(diào)函數(shù)的參數(shù)將其返回給客戶端。socket
或者進(jìn)行握手。注意:issuer
可以是null
,如果證書是自簽名的或issuer
不在根證書列表之內(nèi)(你可以通過ca
參數(shù)提供一個(gè)issuer
)。
注意:這個(gè)事件監(jiān)聽器只會(huì)影響到它被添加之后建立的連接。
注意:你可能想要使用一些如asn1.js
的npm
模塊來解釋證書。
從指定的端口和主機(jī)名接收連接。如果hostname
被忽略,服務(wù)器會(huì)在當(dāng)IPv6可用時(shí),接受任意IPv6地址(::
)上的連接,否則為任意IPv4(0.0.0.0
)上的。將port
設(shè)置為0
則會(huì)賦予其一個(gè)隨機(jī)端口。
這個(gè)函數(shù)是異步的。最后一個(gè)參數(shù)callback
會(huì)在服務(wù)器被綁定后執(zhí)行。
更多信息請(qǐng)參閱net.Server
。
阻止服務(wù)器繼續(xù)接收新連接。這個(gè)函數(shù)是異步的,當(dāng)服務(wù)器觸發(fā)一個(gè)close
事件時(shí),服務(wù)器將最終被關(guān)閉??蛇x的,你可以傳遞一個(gè)回調(diào)函數(shù)來監(jiān)聽close
事件。
返回綁定的地址,服務(wù)器地址的協(xié)議族名和端口通過操作系統(tǒng)報(bào)告。更多信息請(qǐng)參閱net.Server.address()
。
添加安全內(nèi)容,它將會(huì)在如果客戶端請(qǐng)求的SNI主機(jī)名被傳遞的主機(jī)名匹配(可以使用通配符)時(shí)使用。context
可以包含密鑰,證書,CA 和/或 其他任何tls.createSecureContext
的options
參數(shù)的屬性。
當(dāng)服務(wù)器連接數(shù)變多時(shí),設(shè)置這個(gè)值來拒絕連接。
服務(wù)器上的當(dāng)前連接數(shù)。
穩(wěn)定度: 0 - 棄用。 使用
tls.TLSSocket
替代。
這是一個(gè)加密流。
一個(gè)底層socket
的bytesWritten
存取器的代理,它會(huì)返回寫入socket
的總字節(jié)數(shù),包括TLS開銷。
這是一個(gè)net.Socket
的包裝,但是對(duì)寫入的數(shù)據(jù)做了透明的加密,并且要求TLS協(xié)商。
這個(gè)實(shí)例實(shí)現(xiàn)了一個(gè)雙工流接口。它有所有普通流所擁有的事件和方法。
在一個(gè)新連接成功握手后,這個(gè)事件被觸發(fā)。無論服務(wù)器的證書被授權(quán)與否,這個(gè)監(jiān)聽器都會(huì)被調(diào)用。測(cè)試tlsSocket.authorized
來 驗(yàn)證服務(wù)器證書是否被一個(gè)指定CA所簽名 取決于用戶。如果tlsSocket.authorized === false
那么錯(cuò)誤可以從tlsSocket.authorizationError
里被發(fā)現(xiàn)。如果NPN
被使用,你可以通過tlsSocket.npnProtocol
來檢查已協(xié)商協(xié)議。
如果requestOCSP
選項(xiàng)被設(shè)置,這個(gè)事件會(huì)觸發(fā)。response
是一個(gè)buffer
對(duì)象,包含了服務(wù)器的OCSP響應(yīng)。
習(xí)慣上,response
是一個(gè)來自服務(wù)器的CA(包含服務(wù)器的證書撤銷狀態(tài))的已簽名對(duì)象。
靜態(tài)布爾變量,總是true
??赡軙?huì)被用來區(qū)分TLS socket
和普通的socket
。
如果對(duì)等(peer)證書通過一個(gè)指定的CA被簽名,那么這個(gè)值為true
。否則為false
。
對(duì)等(peer)的證書沒有被驗(yàn)證的原因。這個(gè)值只在tlsSocket.authorized === false
時(shí)可用。
返回了一個(gè)代表了對(duì)等證書的對(duì)象。返回的對(duì)象有一些屬性與證書的屬性一致。如果detailed
參數(shù)被設(shè)置為true
,issuer
屬性的完整鏈都會(huì)被返回,如果為false
,只返回不包含issuer
屬性的頂端的證書。
例子:
{ subject:
{ C: 'UK',
ST: 'Acknack Ltd',
L: 'Rhys Jones',
O: 'io.js',
OU: 'Test TLS Certificate',
CN: 'localhost' },
issuerInfo:
{ C: 'UK',
ST: 'Acknack Ltd',
L: 'Rhys Jones',
O: 'io.js',
OU: 'Test TLS Certificate',
CN: 'localhost' },
issuer:
{ ... another certificate ... },
raw: < RAW DER buffer >,
valid_from: 'Nov 11 09:52:22 2009 GMT',
valid_to: 'Nov 6 09:52:22 2029 GMT',
fingerprint: '2A:7A:C2:DD:E5:F9:CC:53:72:35:99:7A:02:5A:71:38:52:EC:8A:DF',
serialNumber: 'B9B0D332A1AA5635' }
如果peer
沒有提供一個(gè)證書,那么會(huì)返回null
或空對(duì)象。
返回一個(gè)代表了當(dāng)前連接的加密器名和SSL/TLS協(xié)議版本的對(duì)象。
例子: { name: 'AES256-SHA', version: 'TLSv1/SSLv3' }
參閱http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_CIPHERS
中SSL_CIPHER_get_name()
和SSL_CIPHER_get_version()
。
初始化TLS重新協(xié)商過程。optios
可以包含以下屬性:rejectUnauthorized
,requestCert
(詳情參閱tls.createServer
)。一旦重協(xié)商成功,callback(err)
會(huì)帶著err
為null
執(zhí)行。
注意:可以被用來請(qǐng)求對(duì)等(peer)證書在安全連接建立之后。
另一個(gè)注意點(diǎn):當(dāng)作為服務(wù)器運(yùn)行時(shí),socekt
在handshakeTimeout
超時(shí)后,會(huì)帶著一個(gè)錯(cuò)誤被銷毀。
設(shè)置TLS碎片大小的最大值(默認(rèn)最大值為16384
,最小值為512
)。若設(shè)置成功返回true
,否則返回false
。
更小的碎片大小來減少客戶端的緩沖延遲:大的碎片通過TLS層緩沖,直到收到全部的碎片并且它的完整性被驗(yàn)證;大碎片可能會(huì)跨越多次通信,并且可能會(huì)被報(bào)文丟失和重新排序所延遲。但是,更小的碎片增加了額外的TLS框架字節(jié)和CPU開銷,可能會(huì)減少總體的服務(wù)器負(fù)載。
返回ASN.1
編碼的TLS會(huì)話,如果沒有被協(xié)商,返回undefined
??梢员挥迷谥匦逻B接服務(wù)器時(shí),加速握手的建立。
注意:僅在客戶端TLS socket
中工作。僅在調(diào)試時(shí)有用,因?yàn)闀?huì)話重新使用了給tls.connect
提供的session
選項(xiàng)。
返回TLS會(huì)話門票(ticket),如果沒有被協(xié)商,返回undefined
。
返回綁定的地址,協(xié)議族名和端口由底層系統(tǒng)報(bào)告。返回一個(gè)含有三個(gè)屬性的對(duì)象,例如:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
。
代表了遠(yuǎn)程IP地址的字符串。例子:'74.125.127.100'
或'2001:4860:a005::68'
。
代表了遠(yuǎn)程IP協(xié)議族的字符串。'IPv4'
或'IPv6'
。
代表了遠(yuǎn)程端口數(shù)字。例子:443
。
代表了本地IP地址的字符串。
代表了本地端口的數(shù)字。
更多建議: