99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

IO.js TLS/SSL

2018-11-28 22:35 更新

穩(wěn)定度: 2 - 穩(wěn)定

通過require('tls')來使用這個模塊。

tls模塊使用OpenSSL來提供傳輸層的安全 和/或 安全socket層:已加密的流通信。

TLS/SSL是一種公/私鑰架構(gòu)。每個客戶端和每個服務(wù)器都必須有一個私鑰。一個私鑰通過像如下的方式創(chuàng)建:

openssl genrsa -out ryans-key.pem 2048

所有的服務(wù)器和部分的客戶端需要一個證書。證書是被CA簽名或自簽名的公鑰。獲取一個證書第一步是創(chuàng)建一個“證書簽署請求(Certificate Signing Request)”(CSR)文件。通過:

openssl req -new -sha256 -key ryans-key.pem -out ryans-csr.pem

要通過CSR創(chuàng)建一個自簽名證書,通過:

openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem

另外,你也可以把CSR交給一個CA請求簽名。

為了完全向前保密(PFS),需要產(chǎn)生一個 迪菲-赫爾曼 參數(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
  • in: 證書
  • inkey: 私鑰
  • certfile: 將所有CA certs串聯(lián)在一個文件中,就像cat ca1-cert.pem ca2-cert.pem > ca-cert.pem。

客戶端發(fā)起的重新協(xié)商攻擊的減緩

TLS協(xié)議讓客戶端可以重新協(xié)商某些部分的TLS會話。不幸的是,會話重協(xié)商需要不相稱的服務(wù)器端資源,這它可能成為潛在的DOS攻擊。

為了減緩這種情況,重新協(xié)商被限制在了每10分鐘最多3次。當(dāng)超過閥值時,tls.TLSSocket會觸發(fā)一個錯誤。閥值是可以調(diào)整的:

  • tls.CLIENT_RENEG_LIMIT: 重新協(xié)商限制,默認(rèn)為3

  • tls.CLIENT_RENEG_WINDOW: 重新協(xié)商窗口(秒),默認(rèn)為10分鐘。

除非你知道你在做什么,否則不要改變默認(rèn)值。

為了測試你的服務(wù)器,使用openssl s_client -connect address:port來連接它,然后鍵入R<CR>(字母R加回車)多次。

NPN 和 SNI

NPN(下個協(xié)議協(xié)商)和SNI(服務(wù)器名稱指示)都是TLS握手拓展,它們允許你:

  • NPN - 通過多個協(xié)議(HTTP,SPDY)使用一個TLS服務(wù)器。
  • SNI - 通過多個有不同的SSL證書的主機名來使用一個TLS服務(wù)器。

完全向前保密

術(shù)語“向前保密”或“完全向前保密”描述了一個密鑰-協(xié)商(如密鑰-交換)方法的特性。事實上,它意味著,甚至是當(dāng)(你的)服務(wù)器的私鑰被竊取了,竊取者也只能在他成功獲得所有會話產(chǎn)生的密鑰對時,才能解碼信息。

它通過在每次握手中(而不是所有的會話都是同樣的密鑰)隨機地產(chǎn)生用于密鑰-協(xié)商的密鑰對來實現(xiàn)。實現(xiàn)了這個技術(shù)的方法被稱作“ephemeral”。

目前有兩種普遍的方法來實現(xiàn)完全向前保密:

  • DHE - 一個 迪菲-赫爾曼 密鑰-協(xié)商 協(xié)議的ephemeral版本。
  • ECDHE - 一個橢圓曲線 迪菲-赫爾曼 密鑰-協(xié)商 協(xié)議的ephemeral版本。

ephemeral方法可能有一些性能問題,因為密鑰的生成是昂貴的。

tls.getCiphers()

返回支持的SSL加密器的名字?jǐn)?shù)組。

例子:

var ciphers = tls.getCiphers();
console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...]

tls.createServer(options[, secureConnectionListener])

創(chuàng)一個新的tls.Server實例。connectionListener參數(shù)被自動添加為secureConnection事件的監(jiān)聽器。options參數(shù)可以有以下屬性:

  • pfx: 一個包含PFXPKCS12格式的私鑰,加密憑證和CA證書的字符串或buffer

  • key: 一個帶著PEM加密私鑰的字符串(可以是密鑰數(shù)組)(必選)。

  • passphrase: 一個私鑰或pfx密碼字符串。

  • cert: 一個包含了PEM格式的服務(wù)器證書密鑰的字符串或buffer(可以是cert數(shù)組)(必選)。

  • ca: 一個PEM格式的受信任證書的字符串或buffer數(shù)組。如果它被忽略,將使用一些眾所周知的“根”CA,像VeriSign。這些被用來授權(quán)連接。

  • crl : 一個PEM編碼的證書撤銷列表(Certificate Revocation List)字符串或字符串列表。

  • ciphers: 一個描述要使用或排除的加密器的字符串,通過:分割。默認(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ī)范可能提供了一個兼容的加密器套件。更多格式細(xì)節(jié),參閱OpenSSL cipher list format documentation。

  • ecdhCurve: 一個描述用于ECDH密鑰協(xié)商的已命名的橢圓的字符串,如果要禁用ECDH,就設(shè)置為false。

默認(rèn)值為prime256v1(NIST P-256)。使用crypto.getCurves()來獲取一個可用的橢圓列表。在最近的發(fā)行版中,運行openssl ecparam -list_curves命令也會展示所有可用的橢圓的名字和描述。

  • dhparam: 一個包含了迪菲-赫爾曼參數(shù)的字符串或buffer,要求有完全向前保密。使用openssl dhparam來創(chuàng)建它。它的密鑰長度需要大于等于1024字節(jié),否則會拋出一個錯誤。強力推薦使用2048或更多位,來獲取更高的安全性。如果參數(shù)被忽略或不合法,它會被默默丟棄并且DHE加密器將不可用。

  • handshakeTimeout: 當(dāng)SSL/TLS握手在這個指定的毫秒數(shù)后沒有完成時,終止這個鏈接。默認(rèn)為120秒。

當(dāng)握手超時時,tls.Server會觸發(fā)一個clientError事件。

  • honorCipherOrder : 選擇一個加密器時,使用使用服務(wù)器的首選項而不是客戶端的首選項。默認(rèn)為true。

  • requestCert: 如果設(shè)置為true,服務(wù)器將會向連接的客戶端請求一個證書,并且試圖驗證這個證書。默認(rèn)為true。

  • rejectUnauthorized: 如果設(shè)置為true,服務(wù)器會拒絕所有沒有在提供的CA列表中被授權(quán)的客戶端。只有在requestCerttrue時這個選項才有效。默認(rèn)為false。

  • NPNProtocols: 一個可用的NPN協(xié)議的字符串或數(shù)組(協(xié)議應(yīng)該由它們的優(yōu)先級被排序)。

  • SNICallback(servername, cb): 當(dāng)客戶端支持SNI TLS擴展時,這個函數(shù)會被調(diào)用。這個函數(shù)會被傳遞兩個參數(shù):servername和cb。SNICallback必須執(zhí)行cb(null, ctx),ctx是一個SecureContext實例(你可以使用tls.createSecureContext(...)來獲取合適的SecureContext)。如果SNICallback沒有被提供 - 默認(rèn)的有高層次API的回調(diào)函數(shù)會被使用(參閱下文)。

  • sessionTimeout: 一個指定在TLS會話標(biāo)識符和TLS會話門票(tickets)被服務(wù)器創(chuàng)建后的超時時間。更多詳情參閱SSL_CTX_set_timeout

  • ticketKeys: 一個由16字節(jié)前綴,16字節(jié)hmac密鑰,16字節(jié)AEC密鑰組成的48字節(jié)buffer。你可以使用它在不同的tls服務(wù)器實例上接受tls會話門票。

注意:會在cluster模塊工作進程間自動共享。

  • sessionIdContext: 一個包含了會話恢復(fù)標(biāo)識符的字符串。如果requestCerttrue,默認(rèn)值是通過命令行生成的MD5哈希值。否則,就將不提供默認(rèn)值。

  • secureProtocol: 將要使用的SSL方法,舉例,SSLv3_method將強制使用SSL v3??捎玫闹等Q于OpenSSL的安裝和SSL_METHODS常量中被定義的值。

下面是一個簡單應(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

tls.connect(options[, callback])

tls.connect(port[, host][, options][, callback])

根據(jù)給定的 端口和主機(舊API)或 options.portoptions.host 創(chuàng)建一個新的客戶端連接。如果忽略了主機,默認(rèn)為localhost。options可是一個含有以下屬性的對象:

  • host: 客戶端應(yīng)該連接到的主機。

  • port: 客戶端應(yīng)該連接到的端口。

  • socket: 根據(jù)給定的socket的來建立安全連接,而不是創(chuàng)建一個新的socket。如果這個選項被指定,hostport會被忽略。

  • path: 創(chuàng)建到path的unix socket連接。如果這個選項被指定,hostport會被忽略。

  • pfx: 一個PFXPKCS12格式的包含了私鑰,證書和CA證書的字符串或buffer。

  • key: 一個PEM格式的包含了客戶端私鑰的字符串或buffer(可以是密鑰的數(shù)組)。

  • passphrase: 私鑰或pfx的密碼字符串。

  • cert: 一個PEM格式的包含了證書密鑰的字符串或buffer(可以是密鑰的數(shù)組)。

  • ca: 一個PEM格式的受信任證書的字符串或buffer數(shù)組。如果它被忽略,將使用一些眾所周知的CA,像VeriSign。這些被用來授權(quán)連接。

  • ciphers: 一個描述了要使用或排除的加密器,由:分割。使用的默認(rèn)加密器套件與tls.createServer使用的一樣。

  • rejectUnauthorized: 若被設(shè)置為true,會根據(jù)提供的CA列表來驗證服務(wù)器證書。當(dāng)驗證失敗時,會觸發(fā)error事件;err.code包含了一個OpenSSL錯誤碼。默認(rèn)為true。

  • NPNProtocols: 包含支持的NPN協(xié)議的字符串或buffer數(shù)組。buffer必須有以下格式:0x05hello0x05world,第一個字節(jié)是下一個協(xié)議名的長度(傳遞數(shù)組會更簡單:['hello', 'world'])。

  • servername: SNI TLS 擴展的服務(wù)器名。

  • checkServerIdentity(servername, cert): 為根據(jù)證書的服務(wù)器主機名檢查提供了覆蓋。必須在驗證失敗時返回一個錯誤,驗證通過時返回undefined

  • secureProtocol: 將要使用的SSL方法,舉例,SSLv3_method將強制使用SSL v3。可用的值取決于OpenSSL的安裝和SSL_METHODS常量中被定義的值。

  • session: 一個Buffer實例,包含了TLS會話。

callback參數(shù)會被自動添加為secureConnect事件的監(jiān)聽器。

tls.connect()返回一個tls.TLSSocket對象。

以下是一個上述應(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();
});

Class: tls.TLSSocket

net.Socket實例的包裝,替換了內(nèi)部socket的 讀/寫例程,來提供透明的對 傳入/傳出數(shù)據(jù) 的 加密/解密。

new tls.TLSSocket(socket, options)

根據(jù)已存在的TCPsocket,構(gòu)造一個新的TLSSocket對象。

socket是一個net.Socket實例。

options是一個可能包含以下屬性的對象:

  • secureContext: 一個可選的通過tls.createSecureContext( ... )得到的TLS內(nèi)容對象。

  • isServer: 如果為true,TLS socket將會在服務(wù)器模式(server-mode)下被初始化。

  • server: 一個可選的net.Server實例。

  • requestCert: 可選,參閱tls.createSecurePair

  • rejectUnauthorized: 可選,參閱tls.createSecurePair

  • NPNProtocols: 可選,參閱tls.createServer

  • SNICallback: 可選,參閱tls.createServer。

  • session: 可選,一個Buffer實例,包含了TLS會話。

  • requestOCSP: 可選,如果為true,OCSP狀態(tài)請求擴展將會被添加到客戶端 hello,并且OCSPResponse事件將會在建立安全通信前,于socket上觸發(fā)。

tls.createSecureContext(details)

創(chuàng)建一個證書對象,details有可選的以下值:

  • pfx : 一個含有PFXPKCS12編碼的私鑰,證書和CA證書的字符串或buffer
  • key : 一個含有PEM編碼的私鑰的字符串。
  • passphrase : 一個私鑰或pfx密碼字符串。
  • cert : 一個含有PEM加密證書的字符串。
  • ca : 一個用來信任的PEM加密CA證書的字符串或字符串列表。
  • crl : 一個PEM加密CRL的字符串或字符串列表。
  • ciphers: 一個描述需要使用或排除的加密器的字符串。更多加密器的格式細(xì)節(jié)參閱http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT。
  • honorCipherOrder : 選擇一個加密器時,使用使用服務(wù)器的首選項而不是客戶端的首選項。默認(rèn)為true。更多細(xì)節(jié)參閱tls模塊文檔。

如果沒有指定ca,那么io.js將會使用http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt提供的默認(rèn)公共可信任CA列表。

tls.createSecurePair([context][, isServer][, requestCert][, rejectUnauthorized])

根據(jù)兩個流,創(chuàng)建一個新的安全對(secure pair)對象,一個是用來讀/寫加密數(shù)據(jù),另一個是用來讀/寫明文數(shù)據(jù)。通常加密的數(shù)據(jù)是從加密數(shù)據(jù)流被導(dǎo)流而來,明文數(shù)據(jù)被用來作為初始加密流的一個替代。

  • credentials: 一個通過tls.createSecureContext( ... )得到的安全內(nèi)容對象。

  • isServer: 一個表明了 是否這個tls連接應(yīng)被作為一個服務(wù)器或一個客戶端打開 的布爾值。

  • requestCert: 一個表明了 是否服務(wù)器應(yīng)該向連接的客戶端請求證書 的布爾值。只應(yīng)用于服務(wù)器連接。

  • rejectUnauthorized: 一個表明了 是否服務(wù)器應(yīng)該拒絕包含不可用證書的客戶端 的布爾值。只應(yīng)用于啟用了requestCert的服務(wù)器。

tls.createSecurePair()返回一個帶有cleartextencrypted流 屬性的對象。

注意:cleartexttls.TLSSocket有相同的API。

Class: SecurePair

tls.createSecurePair返回。

Event: 'secure'

當(dāng)SecurePair成功建立一個安全連接時,SecurePair會觸發(fā)這個事件

與檢查服務(wù)器的secureConnection事件相似,pair.cleartext.authorized必須被檢查,來確認(rèn)證書是否使用了合適的授權(quán)。

Class: tls.Server

這是一個net.Server的子類,并且與其有相同的方法。除了只接受源TCP連接,這個類還接受通過TLS或SSL加密的數(shù)據(jù)。

Event: 'secureConnection'

  • function (tlsSocket) {}

當(dāng)一個新連接被成功握手后,這個事件會被觸發(fā)。參數(shù)是一個tls.TLSSocket實例。它擁有所有普通流擁有的事件和方法。

socket.authorized是一個表明了 客戶端是否通過提供的服務(wù)器CA來進行了認(rèn)證 的布爾值。如果socket.authorizedfalse,那么socket.authorizationError將被設(shè)置用來描述授權(quán)失敗的原因。一個不明顯的但是值得提出的點:依靠TLS服務(wù)器的設(shè)定,未授權(quán)的連接可能會被接受。socket.npnProtocol是一個包含了被選擇的NPN協(xié)議的字符串。socket.servernam是一個包含了通過SNI請求的服務(wù)器名的字符串。

Event: 'clientError'

  • function (exception, tlsSocket) { }

當(dāng)安全連接被建立之前,服務(wù)器觸發(fā)了一個error事件 - 它會被轉(zhuǎn)發(fā)到這里。

tlsSocket是錯誤來自的tls.TLSSocket。

Event: 'newSession'

  • function (sessionId, sessionData, callback) { }

在TLS會話創(chuàng)建時觸發(fā)??赡軙挥脕碓谕獠看鎯挕?code>callback必須最終被執(zhí)行,否則安全連接將不會收到數(shù)據(jù)。

注意:這個事件監(jiān)聽器只會影響到它被添加之后建立的連接。

Event: 'resumeSession'

  • function (sessionId, callback) { }

當(dāng)客戶端想要恢復(fù)先前的TLS會話時觸發(fā)。事件監(jiān)聽器可能會在外部通過sessionId來尋找會話,并且在結(jié)束后調(diào)用callback(null, sessionData)。如果會話不能被恢復(fù)(例如沒有找到),可能會調(diào)用callback(null, null)。調(diào)用callback(err)會關(guān)閉將要到來的連接并且銷毀socket

注意:這個事件監(jiān)聽器只會影響到它被添加之后建立的連接。

Event: 'OCSPRequest'

  • function (certificate, issuer, callback) { }

當(dāng)客戶端發(fā)送一個證書狀態(tài)請求時觸發(fā)。你可以解釋服務(wù)器當(dāng)前的證書來獲取OCSP url和證書id,并且在獲取了OCSP響應(yīng)后執(zhí)行callback(null, resp),resp是一個Buffer實例。certificateissuer都是一個Buffer,即主鍵和發(fā)起人證書的DER代表(DER-representations)。它們可以被用來獲取OCSP證書id 和 OCSP末端url。

另外,callback(null, null)可以被調(diào)用,意味著沒有OCSP響應(yīng)。

調(diào)用callback(err),將會導(dǎo)致調(diào)用socket.destroy(err)。

典型的流程:

  1. 客戶端連接到服務(wù)器,然后發(fā)送一個OCSPRequest給它(通過ClientHello中擴展的狀態(tài)信息)。
  2. 服務(wù)器接受請求,然后執(zhí)行OCSPRequest事件監(jiān)聽器(如果存在)。
  3. 服務(wù)器通過證書或發(fā)起人抓取OCSP url,然后向CA發(fā)起一個OCSP請求。
  4. 服務(wù)器從CA收到一個OCSPResponse,然后通過回調(diào)函數(shù)的參數(shù)將其返回給客戶端。
  5. 客戶端驗證響應(yīng),然后銷毀socket或者進行握手。

注意:issuer可以是null,如果證書是自簽名的或issuer不在根證書列表之內(nèi)(你可以通過ca參數(shù)提供一個issuer)。

注意:這個事件監(jiān)聽器只會影響到它被添加之后建立的連接。

注意:你可能想要使用一些如asn1.jsnpm模塊來解釋證書。

server.listen(port[, hostname][, callback])

從指定的端口和主機名接收連接。如果hostname被忽略,服務(wù)器會在當(dāng)IPv6可用時,接受任意IPv6地址(::)上的連接,否則為任意IPv4(0.0.0.0)上的。將port設(shè)置為0則會賦予其一個隨機端口。

這個函數(shù)是異步的。最后一個參數(shù)callback會在服務(wù)器被綁定后執(zhí)行。

更多信息請參閱net.Server。

server.close([callback])

阻止服務(wù)器繼續(xù)接收新連接。這個函數(shù)是異步的,當(dāng)服務(wù)器觸發(fā)一個close事件時,服務(wù)器將最終被關(guān)閉??蛇x的,你可以傳遞一個回調(diào)函數(shù)來監(jiān)聽close事件。

server.address()

返回綁定的地址,服務(wù)器地址的協(xié)議族名和端口通過操作系統(tǒng)報告。更多信息請參閱net.Server.address()

server.addContext(hostname, context)

添加安全內(nèi)容,它將會在如果客戶端請求的SNI主機名被傳遞的主機名匹配(可以使用通配符)時使用。context可以包含密鑰,證書,CA 和/或 其他任何tls.createSecureContextoptions參數(shù)的屬性。

server.maxConnections

當(dāng)服務(wù)器連接數(shù)變多時,設(shè)置這個值來拒絕連接。

server.connections

服務(wù)器上的當(dāng)前連接數(shù)。

Class: CryptoStream

穩(wěn)定度: 0 - 棄用。 使用tls.TLSSocket替代。

這是一個加密流。

cryptoStream.bytesWritten

一個底層socketbytesWritten存取器的代理,它會返回寫入socket的總字節(jié)數(shù),包括TLS開銷。

Class: tls.TLSSocket

這是一個net.Socket的包裝,但是對寫入的數(shù)據(jù)做了透明的加密,并且要求TLS協(xié)商。

這個實例實現(xiàn)了一個雙工流接口。它有所有普通流所擁有的事件和方法。

Event: 'secureConnect'

在一個新連接成功握手后,這個事件被觸發(fā)。無論服務(wù)器的證書被授權(quán)與否,這個監(jiān)聽器都會被調(diào)用。測試tlsSocket.authorized來 驗證服務(wù)器證書是否被一個指定CA所簽名 取決于用戶。如果tlsSocket.authorized === false那么錯誤可以從tlsSocket.authorizationError里被發(fā)現(xiàn)。如果NPN被使用,你可以通過tlsSocket.npnProtocol來檢查已協(xié)商協(xié)議。

Event: 'OCSPResponse'

  • function (response) { }

如果requestOCSP選項被設(shè)置,這個事件會觸發(fā)。response是一個buffer對象,包含了服務(wù)器的OCSP響應(yīng)。

習(xí)慣上,response是一個來自服務(wù)器的CA(包含服務(wù)器的證書撤銷狀態(tài))的已簽名對象。

tlsSocket.encrypted

靜態(tài)布爾變量,總是true??赡軙挥脕韰^(qū)分TLS socket和普通的socket。

tlsSocket.authorized

如果對等(peer)證書通過一個指定的CA被簽名,那么這個值為true。否則為false。

tlsSocket.authorizationError

對等(peer)的證書沒有被驗證的原因。這個值只在tlsSocket.authorized === false時可用。

tlsSocket.getPeerCertificate([ detailed ])

返回了一個代表了對等證書的對象。返回的對象有一些屬性與證書的屬性一致。如果detailed參數(shù)被設(shè)置為true,issuer屬性的完整鏈都會被返回,如果為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沒有提供一個證書,那么會返回null或空對象。

tlsSocket.getCipher()

返回一個代表了當(dāng)前連接的加密器名和SSL/TLS協(xié)議版本的對象。

例子: { name: 'AES256-SHA', version: 'TLSv1/SSLv3' }

參閱http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_CIPHERSSSL_CIPHER_get_name()SSL_CIPHER_get_version()。

tlsSocket.renegotiate(options, callback)

初始化TLS重新協(xié)商過程。optios可以包含以下屬性:rejectUnauthorizedrequestCert(詳情參閱tls.createServer)。一旦重協(xié)商成功,callback(err)會帶著errnull執(zhí)行。

注意:可以被用來請求對等(peer)證書在安全連接建立之后。

另一個注意點:當(dāng)作為服務(wù)器運行時,socekthandshakeTimeout超時后,會帶著一個錯誤被銷毀。

tlsSocket.setMaxSendFragment(size)

設(shè)置TLS碎片大小的最大值(默認(rèn)最大值為16384,最小值為512)。若設(shè)置成功返回true,否則返回false。

更小的碎片大小來減少客戶端的緩沖延遲:大的碎片通過TLS層緩沖,直到收到全部的碎片并且它的完整性被驗證;大碎片可能會跨越多次通信,并且可能會被報文丟失和重新排序所延遲。但是,更小的碎片增加了額外的TLS框架字節(jié)和CPU開銷,可能會減少總體的服務(wù)器負(fù)載。

tlsSocket.getSession()

返回ASN.1編碼的TLS會話,如果沒有被協(xié)商,返回undefined??梢员挥迷谥匦逻B接服務(wù)器時,加速握手的建立。

tlsSocket.getTLSTicket()

注意:僅在客戶端TLS socket中工作。僅在調(diào)試時有用,因為會話重新使用了給tls.connect提供的session選項。

返回TLS會話門票(ticket),如果沒有被協(xié)商,返回undefined。

tlsSocket.address()

返回綁定的地址,協(xié)議族名和端口由底層系統(tǒng)報告。返回一個含有三個屬性的對象,例如:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }。

tlsSocket.remoteAddress

代表了遠(yuǎn)程IP地址的字符串。例子:'74.125.127.100''2001:4860:a005::68'。

tlsSocket.remoteFamily

代表了遠(yuǎn)程IP協(xié)議族的字符串。'IPv4''IPv6'。

tlsSocket.remotePort

代表了遠(yuǎn)程端口數(shù)字。例子:443。

tlsSocket.localAddress

代表了本地IP地址的字符串。

tlsSocket.localPort

代表了本地端口的數(shù)字。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號