Node.js TLS/SSL

Stability: 3 - Stable

可使用 require('tls') 來訪問這個模塊。javascript

tls 模塊 使用 OpenSSL 來提供傳輸層(Transport Layer)安全性和(或)安全套接層(Secure Socket Layer):加密過的流通信。css

TLS/SSL 是一種公鑰/私鑰基礎架構。每一個客戶端和服務端都須要一個私鑰。私鑰能夠用如下方法建立的:html

openssl genrsa -out ryans-key.pem 2048

全部服務器和某些客戶端須要證書。證書由認證中心(Certificate Authority)簽名,或者自簽名。得到證書第一步是建立一個證書籤名請求 "Certificate Signing Request" (CSR)文件。證書能夠用如下方法建立的:java

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

使用CSR建立一個自簽名的證書:node

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

或者你能夠發送 CSR 給認證中心(Certificate Authority)來簽名。npm

(TODO: 建立 CA 的文檔, 感興趣的讀者能夠在 Node 源碼 test/fixtures/keys/Makefile 裏查看)數組

建立 .pfx 或 .p12,能夠這麼作:緩存

openssl pkcs12 -export -in agent5-cert.pem -inkey agent5-key.pem \ -certfile ca-cert.pem -out agent5.pfx
  • in: certificate
  • inkey: private key
  • certfile: all CA certs concatenated in one file likecat ca1-cert.pem ca2-cert.pem > ca-cert.pem

協議支持

Node.js 默認遵循 SSLv2 和 SSLv3 協議,不過這些協議被禁用。由於他們不太可靠,很容易受到威脅,參見 CVE-2014-3566。某些狀況下,舊版本客戶端/服務器(好比 IE6)可能會產生問題。若是你想啓用 SSLv2 或 SSLv3 ,使用參數--enable-ssl2--enable-ssl3 運行 Node。Node.js 的將來版本中不會再默認編譯 SSLv2 和 SSLv3。安全

有一個辦法能夠強制 node 進入僅使用 SSLv3 或 SSLv2 模式,分別指定secureProtocol'SSLv3_method''SSLv2_method'bash

Node.js 使用的默認協議方法準確名字是 AutoNegotiate_method, 這個方法會嘗試並協商客戶端支持的從高到底協議。爲了提供默認的安全級別,Node.js(v0.10.33 版本以後)經過將 secureOptions 設爲SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2 ,明確的禁用了 SSLv3 和 SSLv2(除非你給secureProtocol 傳值--enable-ssl3, 或 --enable-ssl2, 或 SSLv3_method )。

若是你設置了 secureOptions,咱們不會從新這個參數。

改變這個行爲的後果:

  • 若是你的應用被當作爲安全服務器,SSLv3 客戶端不能協商創建鏈接,會被拒絕。這種狀況下,你的服務器會觸發 clientError 事件。錯誤消息會包含錯誤版本數字( 'wrong version number').
  • 若是你的應用被當作安全客戶端,和一個不支持比 SSLv3 更高安全性的方法的服務器通信,你的鏈接不會協商成功。這種狀況下,你的客戶端會觸發 clientError 事件。錯誤消息會包含錯誤版本數字( 'wrong version number').

Client-initiated renegotiation attack mitigation

TLS 協議讓客戶端協商 TLS 會話的某些方法內容。可是,會話協商須要服務器端響應的資源,這回讓它成爲阻斷服務攻擊(denial-of-service attacks)的潛在媒介。

爲了下降這種狀況的發生,從新協商被限制爲每10分鐘3次。當超出這個界限時,在 tls.TLSSocket 實例上會觸發錯誤。這個限制可設置:

  • tls.CLIENT_RENEG_LIMIT: 從新協商 limit, 默認是 3.

  • tls.CLIENT_RENEG_WINDOW: 從新協商窗口的時間,單位秒, 默認是 10 分鐘.

除非你明確知道本身在幹什麼,不然不要改變默認值。

要測試你的服務器的話,使用openssl s_client -connect address:port 鏈接服務器,並敲 R<CR>(字母 R 鍵加回車)幾回。

NPN and SNI

NPN (Next Protocol Negotiation 下次協議協商) 和 SNI (Server Name Indication 域名指示) 都是 TLS 握手擴展,運行你:

  • NPN - 同一個TLS服務器使用多種協議 (HTTP, SPDY)
  • SNI - 同一個TLS服務器使用多個主機名(不一樣的 SSL 證書)。certificates.

徹底正向保密

"Forward Secrecy" 或 "Perfect Forward Secrecy-徹底正向保密" 協議描述了祕鑰協商(好比祕鑰交換)方法的特色。實際上這意味着及時你的服務器的祕鑰有危險,通信僅有可能被一類人竊聽,他們必須設法獲的每次會話都會生成的祕鑰對。

徹底正向保密是經過每次握手時爲祕鑰協商隨機生成密鑰對來完成(和全部會話一個 key 相反)。實現這個技術(提供徹底正向保密-Perfect Forward Secrecy)的方法被稱爲 "ephemeral"。

一般目前有2個方法用於完成徹底正向保密(Perfect Forward Secrecy):

  • DHE - 一個迪菲-赫爾曼密鑰交換密鑰協議(Diffie Hellman key-agreement protocol)短暫(ephemeral)版本。
  • ECDHE - 一個橢圓曲線密鑰交換密鑰協議( Elliptic Curve Diffie Hellman key-agreement protocol)短暫(ephemeral)版本。

短暫(ephemeral)方法有性能缺點,由於生成 key 很是耗費資源。

tls.getCiphers()

返回支持的 SSL 密碼名數組。

例子:

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

tls.createServer(options[, secureConnectionListener])

建立一個新的 tls.Server。參數 connectionListener 會自動設置爲 secureConnection 事件的監聽器。參數 options 對象有如下可能性:

  • pfx: 包含私鑰,證書和服務器的 CA 證書(PFX 或 PKCS12 格式)字符串或緩存Buffer。(key, certca互斥)。

  • key: 包含服務器私鑰(PEM 格式)字符串或緩存Buffer。(能夠是keys的數組)(必傳)。

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

  • cert: 包含服務器證書key(PEM 格式)字符串或緩存Buffer。(能夠是certs的數組)(必傳)。

  • ca: 信任的證書(PEM 格式)的字符串/緩存數組。若是忽略這個參數,將會使用"root" CAs ,好比 VeriSign。用來受權鏈接。

  • crl : 不是 PEM 編碼 CRLs (證書撤銷列表 Certificate Revocation List)的字符串就是字符串列表.

  • ciphers: 要使用或排除的密碼(cipher)字符串

    爲了減輕BEAST attacks ,推薦使用這個參數和以後會提到的 honorCipherOrder 參數來優化non-CBC 密碼(cipher)

    默認:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL.格式上更多細節參見 OpenSSL cipher list format documentation

    ECDHE-RSA-AES128-SHA256, DHE-RSA-AES128-SHA256AES128-GCM-SHA256 都是 TLS v1.2 密碼(cipher),當 node.js 鏈接 OpenSSL 1.0.1 或更早版本(好比)時使用。注意, honorCipherOrder 設置爲 enabled 後,如今任然能夠和 TLS v1.2 客戶端協商弱密碼(cipher),

    RC4 可做爲客戶端和老版本 TLS 協議通信的備用方法。RC4 這些年受到懷疑,任何對信任敏感的對象都會考慮其威脅性。國家級別(state-level)的參與者擁有中斷它的能力。

    注意: 早些版本的修訂建議, AES256-SHA 做爲能夠接受的密碼(cipher).Unfortunately, AES256-SHA 是一個 CBC 密碼(cipher),容易受到 BEAST attacks 攻擊。 不要 使用它。

  • ecdhCurve: 包含用來 ECDH 祕鑰交換弧形(curve)名字符串,或者 false 禁用 ECDH。

    默認 prime256v1. 更多細節參考 RFC 4492

  • dhparam: DH 參數文件,用於 DHE 祕鑰協商。使用 openssl dhparam 命令來建立。若是加載文件失敗,會悄悄的拋棄它。

  • handshakeTimeout: 若是 SSL/TLS 握手事件超過這個參數,會放棄裏鏈接。 默認是 120 秒.

    握手超時後, tls.Server 對象會觸發 'clientError' 事件。

  • honorCipherOrder : 當選擇一個密碼(cipher) 時, 使用服務器配置,而不是客戶端的。

    雖然這個參數默認不可用,仍是推薦你用這個參數,和 ciphers 參數鏈接使用,減輕 BEAST 攻擊。

    注意,若是使用了 SSLv2,服務器會發送本身的配置列表給客戶端,客戶端會挑選密碼(cipher)。默認不支持 SSLv2,除非 node.js 配置了./configure --with-sslv2

  • requestCert: 若是設爲 true,服務器會要求鏈接的客戶端發送證書,並嘗試驗證證書。默認:false

  • rejectUnauthorized: 若是爲 true ,服務器將會拒絕任何不被 CAs 列表受權的鏈接。僅 requestCert 參數爲 true 時這個參數纔有效。默認: false

  • checkServerIdentity(servername, cert): 提供一個重寫的方法來檢查證書對應的主機名。若是驗證失敗,返回 error。若是驗證經過,返回 undefined

  • NPNProtocols: NPN 協議的 Buffer 數組(協議需按優先級排序)。

  • SNICallback(servername, cb): 若是客戶端支持 SNI TLS 擴展會調用這個函數。會傳入2個參數: servernamecbSNICallback 必須調用 cb(null, ctx) ,其中 ctx 是 SecureContext 實例。(你能夠用 tls.createSecureContext(...) 來獲取相應的 SecureContext 上下文)。若是 SNICallback 沒有提供,將會使用高級的 API(參見下文).

  • sessionTimeout: 整數,設定了服務器建立TLS 會話標示符(TLS session identifiers)和 TLS 會話票據(TLS session tickets)後的超時時間(單位:秒)。更多細節參見:SSL_CTX_set_timeout

  • ticketKeys: 一個 48 字節的 Buffer 實例,由 16 字節的前綴,16 字節的 hmac key,16 字節的 AES key 組成。可用用它來接受 tls 服務器實例上的 tls會話票據(tls session tickets)。

    注意: 自動在集羣模塊( cluster module)工做進程間共享。

  • sessionIdContext: 會話恢復(session resumption)的標示符字符串。若是 requestCerttrue。默認值爲命令行生成的 MD5 哈希值。不然不提供默認值。

  • secureProtocol: SSL 使用的方法,例如,SSLv3_method 強制 SSL 版本爲3。可能的值定義於你所安裝的 OpenSSL 中的常量SSL_METHODS

  • secureOptions: 設置服務器配置。例如設置 SSL_OP_NO_SSLv3 可用禁用 SSLv3 協議。全部可用的參數見SSL_CTX_set_options

響應服務器的簡單例子:

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 鏈接服務器來測試:

openssl s_client -connect 127.0.0.1:8000

tls.connect(options[, callback])

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

建立一個新的客戶端鏈接到指定的端口和主機(port and host)(老版本 API),或者options.portoptions.host (若是忽略 host,默認爲 localhost)。options 是一個包含如下值得對象:

  • host: 客戶端須要鏈接到的主機

  • port: 客戶端須要鏈接到的端口

  • socket: 在指定的 socket (而非新建)上創建安全鏈接。若是這個參數有值,將忽略 hostport 參數。

  • path: 建立 到參數path 的 unix socket 鏈接。若是這個參數有值,將忽略 hostport 參數。

  • pfx: 包含私鑰,證書和客戶端( PFX 或 PKCS12 格式)的 CA 證書的字符串或 Buffer 緩存。

  • key: 包含客戶端( PEM 格式)的 私鑰的字符串或 Buffer 緩存。能夠是 keys 數組。

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

  • cert: 包含客戶端證書key(PEM 格式)字符串或緩存Buffer。(能夠是certs的數組)。

  • ca: 信任的證書(PEM 格式)的字符串/緩存數組。若是忽略這個參數,將會使用"root" CAs ,好比 VeriSign。用來受權鏈接。

  • rejectUnauthorized: 若是爲 true ,服務器證書根據 CAs 列表受權列表驗證。若是驗證失敗,觸發 'error' 事件;err.code 包含 OpenSSL 錯誤代碼。默認: true

  • NPNProtocols: NPN 協議的字符串或Buffer 數組。Buffer 必須有如下格式0x05hello0x05world,第一個字節是下一個協議名字的長度。(傳的數組一般很是簡單,好比: ['hello', 'world'])。

  • servername: SNI(域名指示 Server Name Indication) TLS 擴展的服務器名。

  • secureProtocol: SSL 使用的方法,例如,SSLv3_method 強制 SSL 版本爲3。可能的值定義於你所安裝的 OpenSSL 中的常量SSL_METHODS

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

參數 callback 添加到 'secureConnect' 事件上,其效果如同監聽器。

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

這是一個簡單的客戶端應答服務器例子:

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(); });

類: tls.TLSSocket

net.Socket 實例的封裝,取代內部 socket 讀寫程序,執行透明的輸入/輸出數據的加密/解密。

new tls.TLSSocket(socket, options)

從現有的 TCP socket 裏構造一個新的 TLSSocket 對象。

socket 一個 net.Socket 的實例

options 一個包含如下屬性的對象:

  • secureContext: 來自 tls.createSecureContext( ... ) 的可選 TLS 上下文對象。

  • isServer: 若是爲 true, TLS socket 將會在服務器模式(server-mode)初始化。

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

  • requestCert: 可選, 參見 tls.createSecurePair

  • rejectUnauthorized: 可選, 參見 tls.createSecurePair

  • NPNProtocols: 可選, 參見 tls.createServer

  • SNICallback: 可選, 參見 tls.createServer

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

  • requestOCSP: 可選, 若是爲 true - OCSP 狀態請求擴展將會被添加到客戶端 hello,而且 OCSPResponse 事件將會在 socket 上創建安全通信前觸發。

tls.createSecureContext(details)

建立一個憑證(credentials)對象,包含字典有如下的key:

  • pfx : 包含 PFX 或 PKCS12 加密的私鑰,證書和服務器的 CA 證書(PFX 或 PKCS12 格式)字符串或緩存Buffer。(key, certca互斥)。
  • key : 包含 PEM 加密過的私鑰的字符串。
  • passphrase : 私鑰或 pfx 的密碼字符串。
  • cert : 包含 PEM 加密過的證書的字符串。
  • ca : 信任的 PEM 加密過的可信任的證書(PEM 格式)字符串/緩存數組。
  • crl :PEM 加密過的 CRLs(證書撤銷列表)
  • ciphers: 要使用或排除的密碼(cipher)字符串。更多格式上的細節參見 http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT
  • honorCipherOrder : 當選擇一個密碼(cipher) 時, 使用服務器配置,而不是客戶端的。 更多細節參見 tls 模塊文檔。

若是沒給 'ca' 細節,node.js 將會使用默認的公開信任的 CAs 列表(參見http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt)。

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

建立一個新的安全對(secure pair)對象,包含2個流,其中一個讀/寫加密過的數據,另一個讀/寫明文數據。一般加密端數據來自是從輸入的加密數據流,另外一端被當作初始加密流。

  • credentials: 來自 tls.createSecureContext( ... ) 的安全上下文對象。

  • isServer: 是否以服務器/客戶端模式打開這個 tls 鏈接。

  • requestCert: 是否服務器須要鏈接的客戶端發送證書。僅適用於服務端鏈接。

  • rejectUnauthorized:非法證書時,是否服務器須要自動拒絕客戶端。啓用 requestCert後,才適用於服務器。

tls.createSecurePair() 返回一個安全對(SecurePair)對象,包含明文 cleartext 和 密文 encrypted 流 。

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

類: SecurePair

經過 tls.createSecurePair 返回。

事件: 'secure'

一旦安全對(SecurePair)成功創建一個安全鏈接,安全對(SecurePair)將會觸發這個事件。

和檢查服務器 'secureConnection' 事件同樣,pair.cleartext.authorized 必須檢查確認是否適用的證書是受權過的。

類: tls.Server

這是 net.Server 的子類,擁有相同的方法。這個類接受適用 TLS 或 SSL 的加密鏈接,而不是接受原始 TCP 鏈接。

事件: 'secureConnection'

function (tlsSocket) {}

新的鏈接握手成功後回觸發這個事件。參數是 tls.TLSSocket 實例。它擁有經常使用的流方法和事件。

socket.authorized 是否客戶端被證書(服務器提供)受權。若是 socket.authorized 爲 false,socket.authorizationError 是如何受權失敗。值得一提的是,依賴於 TLS 服務器的設置,你的未受權鏈接可能也會被接受。socket.authorizationError 如何受權失敗。值得一提的是,依賴於 TLS 服務器的設置,你的未受權鏈接可能也會被接受。socket.npnProtocol 包含選擇的 NPN 協議的字符串.socket.servername 包含 SNI 請求的服務器名的字符串。

事件: 'clientError'

function (exception, tlsSocket) { }

在安全鏈接創建前,客戶端鏈接觸發 'error' 事件會轉發到這裏來。

tlsSockettls.TLSSocket,錯誤是從這裏觸發的。

事件: 'newSession'

function (sessionId, sessionData, callback) { }

建立 TLS 會話的時候會觸發。可能用來在外部存儲器裏存儲會話。callback 必須最後調用,不然無法從安全鏈接發送/接收數據。

注意: 添加這個事件監聽器僅會在鏈接鏈接時有效果。

事件: 'resumeSession'

function (sessionId, callback) { }

當客戶端想恢復以前的 TLS 會話時會觸發。事件監聽器可能會使用 sessionId 到外部存儲器裏查找,一旦結束會觸發 callback(null, sessionData)。若是會話不能恢復(好比不存在這個會話),可能會調用 callback(null, null)。調用 callback(err) 將會終止鏈接,並銷燬 socket。

注意: 添加這個事件監聽器僅會在鏈接鏈接時有效果。

事件: 'OCSPRequest'

function (certificate, issuer, callback) { }

當客戶端發送證書狀態請求時會觸發。你能夠解析服務器當前的證書,來獲取 OCSP 網址和證書 id,獲取 OCSP 響應調用 callback(null, resp),其中 respBuffer 實例。 證書(certificate)和發行者(issuer) 都是初級表達式緩存(Buffer DER-representations of the primary)和證書的發行者。它能夠用來獲取 OCSP 證書和 OCSP 終點網址。

能夠調用callback(null, null),表示沒有 OCSP 響應。

調用 callback(err) 可能會致使調用 socket.destroy(err)

典型流程:

  1. 客戶端鏈接服務器,併發送 OCSPRequest(經過 ClientHello 裏的狀態信息擴展)。
  2. 服務器收到請求,調用 OCSPRequest 事件監聽器。
  3. 服務器從 certificateissuer 獲取 OCSP 網址,並執行 OCSP request 到 CA
  4. 服務器 CA 收到 OCSPResponse, 並經過 callback 參數送回到客戶端
  5. 客戶端驗證響應,並銷燬 socket 或 執行握手

注意: 若是證書是自簽名的,或者若是發行者再也不根證書列表裏(你能夠經過參數提供一個發行者)。 issuer 就可能爲 null。

注意: 添加這個事件監聽器僅會在鏈接鏈接時有效果。

注意: 你能夠能想要使用 npm 模塊(好比 asn1.js)來解析證書。

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

在指定的端口和主機上開始接收鏈接。若是 host 參數沒傳,服務接受經過 IPv4 地址(INADDR_ANY)的直連。

這是異步函數。當服務器已經綁定後回調用最後一個參數callback

更多信息參見 net.Server

server.close()

中止服務器,再也不接收新鏈接。這是異步函數,當服務器觸發 'close' 事件後回最終關閉。

server.address()

返回綁定的地址,地址家族名和服務器端口。更多信息參見 net.Server.address()

server.addContext(hostname, context)

若是客戶端請求 SNI 主機名和傳入的 hostname 相匹配,將會用到安全上下文(secure context)。 context 能夠包含key, cert, ca 和/或tls.createSecureContext options 參數的其餘任何屬性。

server.maxConnections

設置這個屬性能夠在服務器的鏈接數達到最大值時拒絕鏈接。

server.connections

當前服務器鏈接數。

類: CryptoStream

穩定性: 0 - 拋棄. 使用 tls.TLSSocket 替代.

這是一個加密的流

cryptoStream.bytesWritten

底層 socket 寫字節訪問器(bytesWritten accessor)的代理,將會返回寫到 socket 的所有字節數。包括 TLS 的開銷

類: tls.TLSSocket

net.Socket 實例的封裝,透明的加密寫數據和全部必須的 TLS 協商。

這個接口實現了一個雙工流接口。它包含全部經常使用的流方法和事件。

事件: 'secureConnect'

新的鏈接成功握手後回觸發這個事件。不管服務器證書是否受權,都會調用監聽器。用於用戶測試 tlsSocket.authorized看看若是服務器證書已經被指定的 CAs 簽名。若是 tlsSocket.authorized === false ,能夠在 tlsSocket.authorizationError 裏找到錯誤。若是使用了 NPN,你能夠檢tlsSocket.npnProtocol 獲取協商協議(negotiated protocol)。

事件: 'OCSPResponse'

function (response) { }

若是啓用 requestOCSP 參賽會觸發這個事件。 response 是緩存對象,包含服務器的 OCSP 響應。

通常來講, response是服務器 CA 簽名的對象,它包含服務器撤銷證書狀態的信息。

tlsSocket.encrypted

靜態 boolean 變量,一直是 true。能夠用來區別 TLS socket 和 常規對象。

tlsSocket.authorized

boolean 變量,若是 對等實體證書( peer's certificate)被指定的某個 CAs 簽名,返回 true,不然 false

tlsSocket.authorizationError

對等實體證書( peer's certificate)沒有驗證經過的緣由。當 tlsSocket.authorized === false時,這個屬性纔可用。

tlsSocket.getPeerCertificate([ detailed ])

返回一個表明對等實體證書( peer's certificate)的對象。這個返回對象有一些屬性和證書內容相對應。若是參數 detailedtrue,將會返回包含發行者issuer 完整鏈。若是false,僅有頂級證書沒有發行者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 沒有提供證書,返回 null或空對象。

tlsSocket.getCipher()

返回一個對象,它表明了密碼名和當前鏈接的 SSL/TLS 協議的版本。

例子:{ 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() 。

tlsSocket.renegotiate(options, callback)

初始化 TLS 從新協商進程。參數 options 可能包含如下內容: rejectUnauthorized, requestCert (細節參見 tls.createServer)。一旦從新協商成(renegotiation)功完成,將會執行 callback(err),其中 errnull

注意: 當安全鏈接創建後,能夠用這來請求對等實體證書( peer's certificate)。

注意: 做爲服務器運行時,handshakeTimeout 超時後,socket 將會被銷燬。

tlsSocket.setMaxSendFragment(size)

設置最大的 TLS 碎片大小(默認最大值爲:16384,最小值爲:512)。成功的話,返回 true,不然返回 false

小的碎片包會減小客戶端的緩存延遲:大的碎片直到接收完畢後才能被 TLS 層徹底緩存,而且驗證過完整性;大的碎片可能會有屢次往返,而且可能會由於丟包或從新排序致使延遲。而小的碎片會增長額外的 TLS 幀字節和 CPU 負載,這會減小 CPU 的吞吐量。

tlsSocket.getSession()

返回 ASN.1 編碼的 TLS 會話,若是沒有協商,會返回。鏈接到服務器時,能夠用來加速握手的創建。

tlsSocket.getTLSTicket()

注意: 僅和客戶端 TLS socket 打交道。僅在調試時有用,會話重用是,提供 session 參數給 tls.connect

返回 TLS 會話票據(ticket),或若是沒有協商(negotiated),返回 undefined

tlsSocket.address()

返回綁定的地址,地址家族名和服務器端口。更多信息參見 net.Server.address()。返回三個屬性, 好比:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }

tlsSocket.remoteAddress

表示遠程 IP 地址(字符串表示),例如:'74.125.127.100''2001:4860:a005::68'.

tlsSocket.remoteFamily

表示遠程 IP 家族, 'IPv4''IPv6'.

tlsSocket.remotePort

遠程端口(數字表示),列如, 443.

tlsSocket.localAddress

本地 IP 地址(字符串表示)。

tlsSocket.localPort

本地端口號(數字表示)。

相關文章
相關標籤/搜索