Stability: 3 - Stable
可以使用 require('tls') 來(lái)訪問(wèn)這個(gè)模塊。
tls 模塊 使用 OpenSSL 來(lái)提供傳輸層(Transport Layer)安全性和(或)安全套接層(Secure Socket Layer):加密過(guò)的流通訊。
TLS/SSL 是一種公鑰/私鑰基礎(chǔ)架構(gòu)。每個(gè)客戶端和服務(wù)端都需要一個(gè)私鑰。私鑰可以用以下方法創(chuàng)建的:
openssl genrsa -out ryans-key.pem 2048
所有服務(wù)器和某些客戶端需要證書。證書由認(rèn)證中心(Certificate Authority)簽名,或者自簽名。獲得證書第一步是創(chuàng)建一個(gè)證書簽名請(qǐng)求 "Certificate Signing Request" (CSR)文件。證書可以用以下方法創(chuàng)建的:
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
或者你可以發(fā)送 CSR 給認(rèn)證中心(Certificate Authority)來(lái)簽名。
(TODO: 創(chuàng)建 CA 的文檔, 感興趣的讀者可以在 Node 源碼 test/fixtures/keys/Makefile 里查看)
創(chuàng)建 .pfx 或 .p12,可以這么做:
openssl pkcs12 -export -in agent5-cert.pem -inkey agent5-key.pem \
-certfile ca-cert.pem -out agent5.pfx
in: certificateinkey: private keycertfile: all CA certs concatenated in one file like
cat ca1-cert.pem ca2-cert.pem > ca-cert.pemNode.js 默認(rèn)遵循 SSLv2 和 SSLv3 協(xié)議,不過(guò)這些協(xié)議被禁用。因?yàn)樗麄儾惶煽?,很容易受到威脅,參見(jiàn) CVE-2014-3566。某些情況下,舊版本客戶端/服務(wù)器(比如 IE6)可能會(huì)產(chǎn)生問(wèn)題。如果你想啟用 SSLv2 或 SSLv3 ,使用參數(shù)--enable-ssl2 或 --enable-ssl3 運(yùn)行 Node。Node.js 的未來(lái)版本中不會(huì)再默認(rèn)編譯 SSLv2 和 SSLv3。
有一個(gè)辦法可以強(qiáng)制 node 進(jìn)入僅使用 SSLv3 或 SSLv2 模式,分別指定secureProtocol 為 'SSLv3_method' 或 'SSLv2_method'。
Node.js 使用的默認(rèn)協(xié)議方法準(zhǔn)確名字是 AutoNegotiate_method, 這個(gè)方法會(huì)嘗試并協(xié)商客戶端支持的從高到底協(xié)議。為了提供默認(rèn)的安全級(jí)別,Node.js(v0.10.33 版本之后)通過(guò)將 secureOptions 設(shè)為SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2 ,明確的禁用了 SSLv3 和 SSLv2(除非你給secureProtocol 傳值--enable-ssl3, 或 --enable-ssl2, 或 SSLv3_method )。
如果你設(shè)置了 secureOptions,我們不會(huì)重新這個(gè)參數(shù)。
改變這個(gè)行為的后果:
SSLv3 客戶端不能協(xié)商建立連接,會(huì)被拒絕。這種情況下,你的服務(wù)器會(huì)觸發(fā) clientError 事件。錯(cuò)誤消息會(huì)包含錯(cuò)誤版本數(shù)字( 'wrong version number').clientError 事件。錯(cuò)誤消息會(huì)包含錯(cuò)誤版本數(shù)字( 'wrong version number').TLS 協(xié)議讓客戶端協(xié)商 TLS 會(huì)話的某些方法內(nèi)容。但是,會(huì)話協(xié)商需要服務(wù)器端響應(yīng)的資源,這回讓它成為阻斷服務(wù)攻擊(denial-of-service attacks)的潛在媒介。
為了降低這種情況的發(fā)生,重新協(xié)商被限制為每10分鐘3次。當(dāng)超出這個(gè)界限時(shí),在 tls.TLSSocket 實(shí)例上會(huì)觸發(fā)錯(cuò)誤。這個(gè)限制可設(shè)置:
tls.CLIENT_RENEG_LIMIT: 重新協(xié)商 limit, 默認(rèn)是 3.
tls.CLIENT_RENEG_WINDOW: 重新協(xié)商窗口的時(shí)間,單位秒, 默認(rèn)是 10 分鐘.除非你明確知道自己在干什么,否則不要改變默認(rèn)值。
要測(cè)試你的服務(wù)器的話,使用openssl s_client -connect address:port 連接服務(wù)器,并敲 R<CR>(字母 R 鍵加回車)幾次。
NPN (Next Protocol Negotiation 下次協(xié)議協(xié)商) 和 SNI (Server Name Indication 域名指示) 都是 TLS 握手?jǐn)U展,運(yùn)行你:
"Forward Secrecy" 或 "Perfect Forward Secrecy-完全正向保密" 協(xié)議描述了秘鑰協(xié)商(比如秘鑰交換)方法的特點(diǎn)。實(shí)際上這意味著及時(shí)你的服務(wù)器的秘鑰有危險(xiǎn),通訊僅有可能被一類人竊聽(tīng),他們必須設(shè)法獲的每次會(huì)話都會(huì)生成的秘鑰對(duì)。
完全正向保密是通過(guò)每次握手時(shí)為秘鑰協(xié)商隨機(jī)生成密鑰對(duì)來(lái)完成(和所有會(huì)話一個(gè) key 相反)。實(shí)現(xiàn)這個(gè)技術(shù)(提供完全正向保密-Perfect Forward Secrecy)的方法被稱為 "ephemeral"。
通常目前有2個(gè)方法用于完成完全正向保密(Perfect Forward Secrecy):
短暫(ephemeral)方法有性能缺點(diǎn),因?yàn)樯?key 非常耗費(fèi)資源。
返回支持的 SSL 密碼名數(shù)組。
例子:
var ciphers = tls.getCiphers();
console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...]
創(chuàng)建一個(gè)新的 tls.Server。參數(shù) connectionListener 會(huì)自動(dòng)設(shè)置為 secureConnection 事件的監(jiān)聽(tīng)器。參數(shù) options 對(duì)象有以下可能性:
pfx: 包含私鑰,證書和服務(wù)器的 CA 證書(PFX 或 PKCS12 格式)字符串或緩存Buffer。(key, cert 和 ca互斥)。
key: 包含服務(wù)器私鑰(PEM 格式)字符串或緩存Buffer。(可以是keys的數(shù)組)(必傳)。
passphrase: 私鑰或 pfx 的密碼字符串
cert: 包含服務(wù)器證書key(PEM 格式)字符串或緩存Buffer。(可以是certs的數(shù)組)(必傳)。
ca: 信任的證書(PEM 格式)的字符串/緩存數(shù)組。如果忽略這個(gè)參數(shù),將會(huì)使用"root" CAs ,比如 VeriSign。用來(lái)授權(quán)連接。
crl : 不是 PEM 編碼 CRLs (證書撤銷列表 Certificate Revocation List)的字符串就是字符串列表.
ciphers: 要使用或排除的密碼(cipher)字符串
為了減輕BEAST attacks ,推薦使用這個(gè)參數(shù)和之后會(huì)提到的 honorCipherOrder 參數(shù)來(lái)優(yōu)化non-CBC 密碼(cipher)
默認(rèn):ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL.
格式上更多細(xì)節(jié)參見(jiàn) OpenSSL cipher list format documentation
ECDHE-RSA-AES128-SHA256, DHE-RSA-AES128-SHA256 和 AES128-GCM-SHA256 都是 TLS v1.2 密碼(cipher),當(dāng) node.js 連接 OpenSSL 1.0.1 或更早版本(比如)時(shí)使用。注意, honorCipherOrder 設(shè)置為 enabled 后,現(xiàn)在任然可以和 TLS v1.2 客戶端協(xié)商弱密碼(cipher),
RC4 可作為客戶端和老版本 TLS 協(xié)議通訊的備用方法。RC4 這些年受到懷疑,任何對(duì)信任敏感的對(duì)象都會(huì)考慮其威脅性。國(guó)家級(jí)別(state-level)的參與者擁有中斷它的能力。
注意: 早些版本的修訂建議, AES256-SHA 作為可以接受的密碼(cipher).Unfortunately, AES256-SHA 是一個(gè) CBC 密碼(cipher),容易受到 BEAST attacks 攻擊。 不要 使用它。
ecdhCurve: 包含用來(lái) ECDH 秘鑰交換弧形(curve)名字符串,或者 false 禁用 ECDH。
默認(rèn) prime256v1. 更多細(xì)節(jié)參考 RFC 4492 。
dhparam: DH 參數(shù)文件,用于 DHE 秘鑰協(xié)商。使用 openssl dhparam 命令來(lái)創(chuàng)建。如果加載文件失敗,會(huì)悄悄的拋棄它。
handshakeTimeout: 如果 SSL/TLS 握手事件超過(guò)這個(gè)參數(shù),會(huì)放棄里連接。 默認(rèn)是 120 秒.
握手超時(shí)后, tls.Server 對(duì)象會(huì)觸發(fā) 'clientError' 事件。
honorCipherOrder : 當(dāng)選擇一個(gè)密碼(cipher) 時(shí), 使用服務(wù)器配置,而不是客戶端的。
雖然這個(gè)參數(shù)默認(rèn)不可用,還是推薦你用這個(gè)參數(shù),和 ciphers 參數(shù)連接使用,減輕 BEAST 攻擊。
注意,如果使用了 SSLv2,服務(wù)器會(huì)發(fā)送自己的配置列表給客戶端,客戶端會(huì)挑選密碼(cipher)。默認(rèn)不支持 SSLv2,除非 node.js 配置了./configure --with-sslv2。
requestCert: 如果設(shè)為 true,服務(wù)器會(huì)要求連接的客戶端發(fā)送證書,并嘗試驗(yàn)證證書。默認(rèn):false。
rejectUnauthorized: 如果為 true ,服務(wù)器將會(huì)拒絕任何不被 CAs 列表授權(quán)的連接。僅 requestCert 參數(shù)為 true 時(shí)這個(gè)參數(shù)才有效。默認(rèn): false。
checkServerIdentity(servername, cert): 提供一個(gè)重寫的方法來(lái)檢查證書對(duì)應(yīng)的主機(jī)名。如果驗(yàn)證失敗,返回 error。如果驗(yàn)證通過(guò),返回 undefined 。
NPNProtocols: NPN 協(xié)議的 Buffer 數(shù)組(協(xié)議需按優(yōu)先級(jí)排序)。
SNICallback(servername, cb): 如果客戶端支持 SNI TLS 擴(kuò)展會(huì)調(diào)用這個(gè)函數(shù)。會(huì)傳入2個(gè)參數(shù): servername 和 cb。 SNICallback 必須調(diào)用 cb(null, ctx) ,其中 ctx 是 SecureContext 實(shí)例。(你可以用 tls.createSecureContext(...) 來(lái)獲取相應(yīng)的 SecureContext 上下文)。如果 SNICallback 沒(méi)有提供,將會(huì)使用高級(jí)的 API(參見(jiàn)下文).
sessionTimeout: 整數(shù),設(shè)定了服務(wù)器創(chuàng)建TLS 會(huì)話標(biāo)示符(TLS session identifiers)和 TLS 會(huì)話票據(jù)(TLS session tickets)后的超時(shí)時(shí)間(單位:秒)。更多細(xì)節(jié)參見(jiàn):SSL_CTX_set_timeout。
ticketKeys: 一個(gè) 48 字節(jié)的 Buffer 實(shí)例,由 16 字節(jié)的前綴,16 字節(jié)的 hmac key,16 字節(jié)的 AES key 組成??捎糜盟鼇?lái)接受 tls 服務(wù)器實(shí)例上的 tls會(huì)話票據(jù)(tls session tickets)。
注意: 自動(dòng)在集群模塊( cluster module)工作進(jìn)程間共享。
sessionIdContext: 會(huì)話恢復(fù)(session resumption)的標(biāo)示符字符串。如果 requestCert 為 true。默認(rèn)值為命令行生成的 MD5 哈希值。否則不提供默認(rèn)值。
secureProtocol: SSL 使用的方法,例如,SSLv3_method 強(qiáng)制 SSL 版本為3。可能的值定義于你所安裝的 OpenSSL 中的常量SSL_METHODS。
secureOptions: 設(shè)置服務(wù)器配置。例如設(shè)置 SSL_OP_NO_SSLv3 可用禁用 SSLv3 協(xié)議。所有可用的參數(shù)見(jiàn)SSL_CTX_set_options響應(yīng)服務(wù)器的簡(jiǎn)單例子:
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');
});
你可以通過(guò) openssl s_client 連接服務(wù)器來(lái)測(cè)試:
openssl s_client -connect 127.0.0.1:8000
創(chuàng)建一個(gè)新的客戶端連接到指定的端口和主機(jī)(port and host)(老版本 API),或者options.port 和 options.host (如果忽略 host,默認(rèn)為 localhost)。options 是一個(gè)包含以下值得對(duì)象:
host: 客戶端需要連接到的主機(jī)
port: 客戶端需要連接到的端口
socket: 在指定的 socket (而非新建)上建立安全連接。如果這個(gè)參數(shù)有值,將忽略 host 和 port 參數(shù)。
path: 創(chuàng)建 到參數(shù)path 的 unix socket 連接。如果這個(gè)參數(shù)有值,將忽略 host 和 port 參數(shù)。
pfx: 包含私鑰,證書和客戶端( PFX 或 PKCS12 格式)的 CA 證書的字符串或 Buffer 緩存。
key: 包含客戶端( PEM 格式)的 私鑰的字符串或 Buffer 緩存??梢允?keys 數(shù)組。
passphrase: 私鑰或 pfx 的密碼字符串。
cert: 包含客戶端證書key(PEM 格式)字符串或緩存Buffer。(可以是certs的數(shù)組)。
ca: 信任的證書(PEM 格式)的字符串/緩存數(shù)組。如果忽略這個(gè)參數(shù),將會(huì)使用"root" CAs ,比如 VeriSign。用來(lái)授權(quán)連接。
rejectUnauthorized: 如果為 true ,服務(wù)器證書根據(jù) CAs 列表授權(quán)列表驗(yàn)證。如果驗(yàn)證失敗,觸發(fā) 'error' 事件;err.code 包含 OpenSSL 錯(cuò)誤代碼。默認(rèn): true。
NPNProtocols: NPN 協(xié)議的字符串或Buffer 數(shù)組。Buffer 必須有以下格式0x05hello0x05world,第一個(gè)字節(jié)是下一個(gè)協(xié)議名字的長(zhǎng)度。(傳的數(shù)組通常非常簡(jiǎn)單,比如: ['hello', 'world'])。
servername: SNI(域名指示 Server Name Indication) TLS 擴(kuò)展的服務(wù)器名。
secureProtocol: SSL 使用的方法,例如,SSLv3_method 強(qiáng)制 SSL 版本為3??赡艿闹刀x于你所安裝的 OpenSSL 中的常量SSL_METHODS。
session: 一個(gè) Buffer 實(shí)例, 包含 TLS 會(huì)話.參數(shù) callback 添加到 'secureConnect' 事件上,其效果如同監(jiān)聽(tīng)器。
tls.connect() 返回一個(gè) tls.TLSSocket 對(duì)象。
這是一個(gè)簡(jiǎn)單的客戶端應(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 讀寫程序,執(zhí)行透明的輸入/輸出數(shù)據(jù)的加密/解密。
從現(xiàn)有的 TCP socket 里構(gòu)造一個(gè)新的 TLSSocket 對(duì)象。
socket 一個(gè) net.Socket 的實(shí)例
options 一個(gè)包含以下屬性的對(duì)象:
secureContext: 來(lái)自 tls.createSecureContext( ... ) 的可選 TLS 上下文對(duì)象。
isServer: 如果為 true, TLS socket 將會(huì)在服務(wù)器模式(server-mode)初始化。
server: 一個(gè)可選的 net.Server 實(shí)例
requestCert: 可選, 參見(jiàn) tls.createSecurePair
rejectUnauthorized: 可選, 參見(jiàn) tls.createSecurePair
NPNProtocols: 可選, 參見(jiàn) tls.createServer
SNICallback: 可選, 參見(jiàn) 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è)憑證(credentials)對(duì)象,包含字典有以下的key:
pfx : 包含 PFX 或 PKCS12 加密的私鑰,證書和服務(wù)器的 CA 證書(PFX 或 PKCS12 格式)字符串或緩存Buffer。(key, cert 和 ca互斥)。key : 包含 PEM 加密過(guò)的私鑰的字符串。passphrase : 私鑰或 pfx 的密碼字符串。 cert : 包含 PEM 加密過(guò)的證書的字符串。ca : 信任的 PEM 加密過(guò)的可信任的證書(PEM 格式)字符串/緩存數(shù)組。 crl :PEM 加密過(guò)的 CRLs(證書撤銷列表)ciphers: 要使用或排除的密碼(cipher)字符串。更多格式上的細(xì)節(jié)參見(jiàn) http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAThonorCipherOrder : 當(dāng)選擇一個(gè)密碼(cipher) 時(shí), 使用服務(wù)器配置,而不是客戶端的。 更多細(xì)節(jié)參見(jiàn) tls 模塊文檔。如果沒(méi)給 'ca' 細(xì)節(jié),node.js 將會(huì)使用默認(rèn)的公開(kāi)信任的 CAs 列表(參見(jiàn)http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt)。
創(chuàng)建一個(gè)新的安全對(duì)(secure pair)對(duì)象,包含2個(gè)流,其中一個(gè)讀/寫加密過(guò)的數(shù)據(jù),另外一個(gè)讀/寫明文數(shù)據(jù)。通常加密端數(shù)據(jù)來(lái)自是從輸入的加密數(shù)據(jù)流,另一端被當(dāng)做初始加密流。
credentials: 來(lái)自 tls.createSecureContext( ... ) 的安全上下文對(duì)象。
isServer: 是否以服務(wù)器/客戶端模式打開(kāi)這個(gè) tls 連接。
requestCert: 是否服務(wù)器需要連接的客戶端發(fā)送證書。僅適用于服務(wù)端連接。
rejectUnauthorized:非法證書時(shí),是否服務(wù)器需要自動(dòng)拒絕客戶端。啟用 requestCert后,才適用于服務(wù)器。tls.createSecurePair() 返回一個(gè)安全對(duì)(SecurePair)對(duì)象,包含明文 cleartext 和 密文 encrypted 流 。
注意: cleartext 和 tls.TLSSocket 擁有相同的 API。
通過(guò) tls.createSecurePair 返回。
一旦安全對(duì)(SecurePair)成功建立一個(gè)安全連接,安全對(duì)(SecurePair)將會(huì)觸發(fā)這個(gè)事件。
和檢查服務(wù)器 'secureConnection' 事件一樣,pair.cleartext.authorized 必須檢查確認(rèn)是否適用的證書是授權(quán)過(guò)的。
這是 net.Server 的子類,擁有相同的方法。這個(gè)類接受適用 TLS 或 SSL 的加密連接,而不是接受原始 TCP 連接。
function (tlsSocket) {}
新的連接握手成功后回觸發(fā)這個(gè)事件。參數(shù)是 tls.TLSSocket 實(shí)例。它擁有常用的流方法和事件。
socket.authorized 是否客戶端被證書(服務(wù)器提供)授權(quán)。如果 socket.authorized 為 false,socket.authorizationError 是如何授權(quán)失敗。值得一提的是,依賴于 TLS 服務(wù)器的設(shè)置,你的未授權(quán)連接可能也會(huì)被接受。
socket.authorizationError 如何授權(quán)失敗。值得一提的是,依賴于 TLS 服務(wù)器的設(shè)置,你的未授權(quán)連接可能也會(huì)被接受。
socket.npnProtocol 包含選擇的 NPN 協(xié)議的字符串.
socket.servername 包含 SNI 請(qǐng)求的服務(wù)器名的字符串。
function (exception, tlsSocket) { }
在安全連接建立前,客戶端連接觸發(fā) 'error' 事件會(huì)轉(zhuǎn)發(fā)到這里來(lái)。
tlsSocket 是 tls.TLSSocket,錯(cuò)誤是從這里觸發(fā)的。
function (sessionId, sessionData, callback) { }
創(chuàng)建 TLS 會(huì)話的時(shí)候會(huì)觸發(fā)??赡苡脕?lái)在外部存儲(chǔ)器里存儲(chǔ)會(huì)話。callback 必須最后調(diào)用,否則沒(méi)法從安全連接發(fā)送/接收數(shù)據(jù)。
注意: 添加這個(gè)事件監(jiān)聽(tīng)器僅會(huì)在連接連接時(shí)有效果。
function (sessionId, callback) { }
當(dāng)客戶端想恢復(fù)之前的 TLS 會(huì)話時(shí)會(huì)觸發(fā)。事件監(jiān)聽(tīng)器可能會(huì)使用 sessionId 到外部存儲(chǔ)器里查找,一旦結(jié)束會(huì)觸發(fā) callback(null, sessionData)。如果會(huì)話不能恢復(fù)(比如不存在這個(gè)會(huì)話),可能會(huì)調(diào)用 callback(null, null)。調(diào)用 callback(err) 將會(huì)終止連接,并銷毀 socket。
注意: 添加這個(gè)事件監(jiān)聽(tīng)器僅會(huì)在連接連接時(shí)有效果。
function (certificate, issuer, callback) { }
當(dāng)客戶端發(fā)送證書狀態(tài)請(qǐng)求時(shí)會(huì)觸發(fā)。你可以解析服務(wù)器當(dāng)前的證書,來(lái)獲取 OCSP 網(wǎng)址和證書 id,獲取 OCSP 響應(yīng)調(diào)用 callback(null, resp),其中 resp 是 Buffer 實(shí)例。 證書(certificate)和發(fā)行者(issuer) 都是初級(jí)表達(dá)式緩存(Buffer DER-representations of the primary)和證書的發(fā)行者。它可以用來(lái)獲取 OCSP 證書和 OCSP 終點(diǎn)網(wǎng)址。
可以調(diào)用callback(null, null),表示沒(méi)有 OCSP 響應(yīng)。
調(diào)用 callback(err) 可能會(huì)導(dǎo)致調(diào)用 socket.destroy(err)。
典型流程:
OCSPRequest(通過(guò) ClientHello 里的狀態(tài)信息擴(kuò)展)。OCSPRequest 事件監(jiān)聽(tīng)器。certificate 或 issuer 獲取 OCSP 網(wǎng)址,并執(zhí)行 OCSP request 到 CAOCSPResponse, 并通過(guò) callback 參數(shù)送回到客戶端注意: 如果證書是自簽名的,或者如果發(fā)行者不再根證書列表里(你可以通過(guò)參數(shù)提供一個(gè)發(fā)行者)。 issuer 就可能為 null。
注意: 添加這個(gè)事件監(jiān)聽(tīng)器僅會(huì)在連接連接時(shí)有效果。
注意: 你可以能想要使用 npm 模塊(比如 asn1.js)來(lái)解析證書。
在指定的端口和主機(jī)上開(kāi)始接收連接。如果 host 參數(shù)沒(méi)傳,服務(wù)接受通過(guò) IPv4 地址(INADDR_ANY)的直連。
這是異步函數(shù)。當(dāng)服務(wù)器已經(jīng)綁定后回調(diào)用最后一個(gè)參數(shù)callback 。
更多信息參見(jiàn) net.Server 。
停止服務(wù)器,不再接收新連接。這是異步函數(shù),當(dāng)服務(wù)器觸發(fā) 'close' 事件后回最終關(guān)閉。
返回綁定的地址,地址家族名和服務(wù)器端口。更多信息參見(jiàn) net.Server.address()
如果客戶端請(qǐng)求 SNI 主機(jī)名和傳入的 hostname 相匹配,將會(huì)用到安全上下文(secure context)。 context 可以包含key, cert, ca 和/或tls.createSecureContext options 參數(shù)的其他任何屬性。
設(shè)置這個(gè)屬性可以在服務(wù)器的連接數(shù)達(dá)到最大值時(shí)拒絕連接。
當(dāng)前服務(wù)器連接數(shù)。
穩(wěn)定性: 0 - 拋棄. 使用 tls.TLSSocket 替代.
這是一個(gè)加密的流
底層 socket 寫字節(jié)訪問(wèn)器(bytesWritten accessor)的代理,將會(huì)返回寫到 socket 的全部字節(jié)數(shù)。包括 TLS 的開(kāi)銷。
net.Socket 實(shí)例的封裝,透明的加密寫數(shù)據(jù)和所有必須的 TLS 協(xié)商。
這個(gè)接口實(shí)現(xiàn)了一個(gè)雙工流接口。它包含所有常用的流方法和事件。
新的連接成功握手后回觸發(fā)這個(gè)事件。無(wú)論服務(wù)器證書是否授權(quán),都會(huì)調(diào)用監(jiān)聽(tīng)器。用于用戶測(cè)試 tlsSocket.authorized看看如果服務(wù)器證書已經(jīng)被指定的 CAs 簽名。如果 tlsSocket.authorized === false ,可以在 tlsSocket.authorizationError 里找到錯(cuò)誤。如果使用了 NPN,你可以檢tlsSocket.npnProtocol 獲取協(xié)商協(xié)議(negotiated protocol)。
function (response) { }
如果啟用 requestOCSP 參賽會(huì)觸發(fā)這個(gè)事件。 response 是緩存對(duì)象,包含服務(wù)器的 OCSP 響應(yīng)。
一般來(lái)說(shuō), response是服務(wù)器 CA 簽名的對(duì)象,它包含服務(wù)器撤銷證書狀態(tài)的信息。
靜態(tài) boolean 變量,一直是 true??梢杂脕?lái)區(qū)別 TLS socket 和 常規(guī)對(duì)象。
boolean 變量,如果 對(duì)等實(shí)體證書( peer's certificate)被指定的某個(gè) CAs 簽名,返回 true,否則 false。
對(duì)等實(shí)體證書( peer's certificate)沒(méi)有驗(yàn)證通過(guò)的原因。當(dāng) tlsSocket.authorized === false時(shí),這個(gè)屬性才可用。
返回一個(gè)代表對(duì)等實(shí)體證書( peer's certificate)的對(duì)象。這個(gè)返回對(duì)象有一些屬性和證書內(nèi)容相對(duì)應(yīng)。如果參數(shù) detailed 是 true,將會(huì)返回包含發(fā)行者issuer 完整鏈。如果false,僅有頂級(jí)證書沒(méi)有發(fā)行者issuer屬性。
例子:
{ subject:
{ C: 'UK',
ST: 'Acknack Ltd',
L: 'Rhys Jones',
O: 'node.js',
OU: 'Test TLS Certificate',
CN: 'localhost' },
issuerInfo:
{ C: 'UK',
ST: 'Acknack Ltd',
L: 'Rhys Jones',
O: 'node.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 沒(méi)有提供證書,返回 null或空對(duì)象。
返回一個(gè)對(duì)象,它代表了密碼名和當(dāng)前連接的 SSL/TLS 協(xié)議的版本。
例子: { name: 'AES256-SHA', version: 'TLSv1/SSLv3' }
更多信息參見(jiàn)http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_CIPHERS 里的 SSL_CIPHER_get_name() 和 SSL_CIPHER_get_version() 。
初始化 TLS 重新協(xié)商進(jìn)程。參數(shù) options 可能包含以下內(nèi)容: rejectUnauthorized, requestCert (細(xì)節(jié)參見(jiàn) tls.createServer)。一旦重新協(xié)商成(renegotiation)功完成,將會(huì)執(zhí)行 callback(err),其中 err 為 null。
注意: 當(dāng)安全連接建立后,可以用這來(lái)請(qǐng)求對(duì)等實(shí)體證書( peer's certificate)。
注意: 作為服務(wù)器運(yùn)行時(shí),handshakeTimeout 超時(shí)后,socket 將會(huì)被銷毀。
設(shè)置最大的 TLS 碎片大?。J(rèn)最大值為:16384,最小值為:512)。成功的話,返回 true,否則返回 false。
小的碎片包會(huì)減少客戶端的緩存延遲:大的碎片直到接收完畢后才能被 TLS 層完全緩存,并且驗(yàn)證過(guò)完整性;大的碎片可能會(huì)有多次往返,并且可能會(huì)因?yàn)閬G包或重新排序?qū)е卵舆t。而小的碎片會(huì)增加額外的 TLS 幀字節(jié)和 CPU 負(fù)載,這會(huì)減少 CPU 的吞吐量。
返回 ASN.1 編碼的 TLS 會(huì)話,如果沒(méi)有協(xié)商,會(huì)返回。連接到服務(wù)器時(shí),可以用來(lái)加速握手的建立。
注意: 僅和客戶端 TLS socket 打交道。僅在調(diào)試時(shí)有用,會(huì)話重用是,提供 session 參數(shù)給 tls.connect。
返回 TLS 會(huì)話票據(jù)(ticket),或如果沒(méi)有協(xié)商(negotiated),返回 undefined。
返回綁定的地址,地址家族名和服務(wù)器端口。更多信息參見(jiàn) net.Server.address()。返回三個(gè)屬性, 比如:
{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
表示遠(yuǎn)程 IP 地址(字符串表示),例如:'74.125.127.100' 或 '2001:4860:a005::68'.
表示遠(yuǎn)程 IP 家族, 'IPv4' 或 'IPv6'.
遠(yuǎn)程端口(數(shù)字表示),列如, 443.
本地 IP 地址(字符串表示)。
本地端口號(hào)(數(shù)字表示)。