<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 穩定度: 2 - 穩定 通過`require('tls')`來使用這個模塊。 `tls`模塊使用OpenSSL來提供傳輸層的安全 和/或 安全`socket`層:已加密的流通信。 TLS/SSL是一種公/私鑰架構。每個客戶端和每個服務器都必須有一個私鑰。一個私鑰通過像如下的方式創建: ~~~ openssl genrsa -out ryans-key.pem 2048 ~~~ 所有的服務器和部分的客戶端需要一個證書。證書是被CA簽名或自簽名的公鑰。獲取一個證書第一步是創建一個“證書簽署請求(Certificate Signing Request)”(CSR)文件。通過: ~~~ openssl req -new -sha256 -key ryans-key.pem -out ryans-csr.pem ~~~ 要通過CSR創建一個自簽名證書,通過: ~~~ openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem ~~~ 另外,你也可以把CSR交給一個CA請求簽名。 為了完全向前保密(PFS),需要產生一個 迪菲-赫爾曼 參數: ~~~ openssl dhparam -outform PEM -out dhparam.pem 2048 ~~~ 創建`.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`串聯在一個文件中,就像`cat ca1-cert.pem ca2-cert.pem > ca-cert.pem`。 #### 客戶端發起的重新協商攻擊的減緩 TLS協議讓客戶端可以重新協商某些部分的TLS會話。不幸的是,會話重協商需要不相稱的服務器端資源,這它可能成為潛在的DOS攻擊。 為了減緩這種情況,重新協商被限制在了每10分鐘最多3次。當超過閥值時,`tls.TLSSocket`會觸發一個錯誤。閥值是可以調整的: - tls.CLIENT_RENEG_LIMIT: 重新協商限制,默認為`3`。 - tls.CLIENT_RENEG_WINDOW: 重新協商窗口(秒),默認為10分鐘。 除非你知道你在做什么,否則不要改變默認值。 為了測試你的服務器,使用`openssl s_client -connect address:port`來連接它,然后鍵入`R<CR>`(字母`R`加回車)多次。 #### NPN 和 SNI `NPN`(下個協議協商)和SNI(服務器名稱指示)都是TLS握手拓展,它們允許你: - NPN - 通過多個協議(HTTP,SPDY)使用一個TLS服務器。 - SNI - 通過多個有不同的SSL證書的主機名來使用一個TLS服務器。 #### 完全向前保密 術語“向前保密”或“完全向前保密”描述了一個密鑰-協商(如密鑰-交換)方法的特性。事實上,它意味著,甚至是當(你的)服務器的私鑰被竊取了,竊取者也只能在他成功獲得所有會話產生的密鑰對時,才能解碼信息。 它通過在每次握手中(而不是所有的會話都是同樣的密鑰)隨機地產生用于密鑰-協商的密鑰對來實現。實現了這個技術的方法被稱作“ephemeral”。 目前有兩種普遍的方法來實現完全向前保密: - DHE - 一個 迪菲-赫爾曼 密鑰-協商 協議的`ephemeral`版本。 - ECDHE - 一個橢圓曲線 迪菲-赫爾曼 密鑰-協商 協議的`ephemeral`版本。 `ephemeral`方法可能有一些性能問題,因為密鑰的生成是昂貴的。 #### tls.getCiphers() 返回支持的SSL加密器的名字數組。 例子: ~~~ var ciphers = tls.getCiphers(); console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...] ~~~ #### tls.createServer(options[, secureConnectionListener]) 創一個新的`tls.Server`實例。`connectionListener`參數被自動添加為`secureConnection`事件的監聽器。`options`參數可以有以下屬性: - pfx: 一個包含`PFX`或`PKCS12`格式的私鑰,加密憑證和CA證書的字符串或`buffer`。 - key: 一個帶著`PEM`加密私鑰的字符串(可以是密鑰數組)(必選)。 - passphrase: 一個私鑰或`pfx`密碼字符串。 - cert: 一個包含了`PEM`格式的服務器證書密鑰的字符串或`buffer`(可以是`cert`數組)(必選)。 - ca: 一個`PEM`格式的受信任證書的字符串或`buffer`數組。如果它被忽略,將使用一些眾所周知的“根”CA,像`VeriSign`。這些被用來授權連接。 - crl : 一個`PEM`編碼的證書撤銷列表(Certificate Revocation List)字符串或字符串列表。 - ciphers: 一個描述要使用或排除的加密器的字符串,通過`:`分割。默認的加密器套件是: ~~~ 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 ~~~ 默認的加密器套件更傾向于`Chrome's 'modern cryptography' setting`的GCM加密器,也傾向于PFC的ECDHE和DHE加密器,它們提供了一些向后兼容性。 鑒于`specific attacks affecting larger AES key sizes`,所以更傾向于使用128位的AES而不是192和256位的AES。 舊的依賴于不安全的和棄用的RC4或基于DES的加密器(像IE6)的客戶端將不能完成默認配置下的握手。如果你必須支持這些客戶端,`TLS推薦規范`可能提供了一個兼容的加密器套件。更多格式細節,參閱`OpenSSL cipher list format documentation`。 - ecdhCurve: 一個描述用于`ECDH`密鑰協商的已命名的橢圓的字符串,如果要禁用`ECDH`,就設置為`false`。 默認值為`prime256v1`(NIST P-256)。使用`crypto.getCurves()`來獲取一個可用的橢圓列表。在最近的發行版中,運行`openssl ecparam -list_curves`命令也會展示所有可用的橢圓的名字和描述。 - dhparam: 一個包含了迪菲-赫爾曼參數的字符串或`buffer`,要求有完全向前保密。使用`openssl dhparam`來創建它。它的密鑰長度需要大于等于1024字節,否則會拋出一個錯誤。強力推薦使用2048或更多位,來獲取更高的安全性。如果參數被忽略或不合法,它會被默默丟棄并且`DHE`加密器將不可用。 - handshakeTimeout: 當SSL/TLS握手在這個指定的毫秒數后沒有完成時,終止這個鏈接。默認為120秒。 當握手超時時,`tls.Server`會觸發一個`clientError`事件。 - honorCipherOrder : 選擇一個加密器時,使用使用服務器的首選項而不是客戶端的首選項。默認為`true`。 - requestCert: 如果設置為`true`,服務器將會向連接的客戶端請求一個證書,并且試圖驗證這個證書。默認為`true`。 - rejectUnauthorized: 如果設置為`true`,服務器會拒絕所有沒有在提供的CA列表中被授權的客戶端。只有在`requestCert`為`true`時這個選項才有效。默認為`false`。 - NPNProtocols: 一個可用的`NPN`協議的字符串或數組(協議應該由它們的優先級被排序)。 - SNICallback(servername, cb): 當客戶端支持`SNI TLS`擴展時,這個函數會被調用。這個函數會被傳遞兩個參數:servername和cb。`SNICallback`必須執行`cb(null, ctx)`,`ctx`是一個`SecureContext`實例(你可以使用`tls.createSecureContext(...)`來獲取合適的`SecureContext`)。如果`SNICallback`沒有被提供 - 默認的有高層次API的回調函數會被使用(參閱下文)。 - sessionTimeout: 一個指定在TLS會話標識符和TLS會話門票(tickets)被服務器創建后的超時時間。更多詳情參閱`SSL_CTX_set_timeout`。 - ticketKeys: 一個由16字節前綴,16字節hmac密鑰,16字節AEC密鑰組成的48字節`buffer`。你可以使用它在不同的`tls`服務器實例上接受`tls`會話門票。 注意:會在`cluster`模塊工作進程間自動共享。 - sessionIdContext: 一個包含了會話恢復標識符的字符串。如果`requestCert`為`true`,默認值是通過命令行生成的MD5哈希值。否則,就將不提供默認值。 - secureProtocol: 將要使用的SSL方法,舉例,`SSLv3_method`將強制使用SSL v3。可用的值取決于OpenSSL的安裝和`SSL_METHODS`常量中被定義的值。 下面是一個簡單應答服務器的例子: ~~~ 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]) 根據給定的 端口和主機(舊API)或 `options.port`和`options.host` 創建一個新的客戶端連接。如果忽略了主機,默認為`localhost`。`options`可是一個含有以下屬性的對象: - host: 客戶端應該連接到的主機。 - port: 客戶端應該連接到的端口。 - socket: 根據給定的`socket`的來建立安全連接,而不是創建一個新的`socket`。如果這個選項被指定,`host`和`port`會被忽略。 - path: 創建到`path`的unix `socket`連接。如果這個選項被指定,`host`和`port`會被忽略。 - pfx: 一個`PFX`或`PKCS12`格式的包含了私鑰,證書和CA證書的字符串或`buffer`。 - key: 一個`PEM`格式的包含了客戶端私鑰的字符串或`buffer`(可以是密鑰的數組)。 - passphrase: 私鑰或`pfx`的密碼字符串。 - cert: 一個`PEM`格式的包含了證書密鑰的字符串或`buffer`(可以是密鑰的數組)。 - ca: 一個`PEM`格式的受信任證書的字符串或`buffer`數組。如果它被忽略,將使用一些眾所周知的CA,像`VeriSign`。這些被用來授權連接。 - ciphers: 一個描述了要使用或排除的加密器,由`:`分割。使用的默認加密器套件與`tls.createServer`使用的一樣。 - rejectUnauthorized: 若被設置為`true`,會根據提供的CA列表來驗證服務器證書。當驗證失敗時,會觸發`error`事件;`err.code`包含了一個OpenSSL錯誤碼。默認為`true`。 - NPNProtocols: 包含支持的NPN協議的字符串或`buffer`數組。`buffer`必須有以下格式:`0x05hello0x05world`,第一個字節是下一個協議名的長度(傳遞數組會更簡單:`['hello', 'world']`)。 - servername: `SNI` TLS 擴展的服務器名。 - checkServerIdentity(servername, cert): 為根據證書的服務器主機名檢查提供了覆蓋。必須在驗證失敗時返回一個錯誤,驗證通過時返回`undefined`。 - secureProtocol: 將要使用的SSL方法,舉例,`SSLv3_method`將強制使用SSL v3。可用的值取決于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(); }); ~~~ #### Class: 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) 創建一個證書對象,`details`有可選的以下值: - pfx : 一個含有`PFX`或`PKCS12`編碼的私鑰,證書和CA證書的字符串或`buffer`。 - key : 一個含有`PEM`編碼的私鑰的字符串。 - passphrase : 一個私鑰或`pfx`密碼字符串。 - cert : 一個含有`PEM`加密證書的字符串。 - ca : 一個用來信任的`PEM`加密CA證書的字符串或字符串列表。 - crl : 一個`PEM`加密`CRL`的字符串或字符串列表。 - ciphers: 一個描述需要使用或排除的加密器的字符串。更多加密器的格式細節參閱`http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT`。 - honorCipherOrder : 選擇一個加密器時,使用使用服務器的首選項而不是客戶端的首選項。默認為`true`。更多細節參閱`tls`模塊文檔。 如果沒有指定`ca`,那么`io.js`將會使用`http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt`提供的默認公共可信任CA列表。 #### tls.createSecurePair([context][, isServer][, requestCert][, rejectUnauthorized]) 根據兩個流,創建一個新的安全對(secure pair)對象,一個是用來讀/寫加密數據,另一個是用來讀/寫明文數據。通常加密的數據是從加密數據流被導流而來,明文數據被用來作為初始加密流的一個替代。 - credentials: 一個通過`tls.createSecureContext( ... )`得到的安全內容對象。 - isServer: 一個表明了 是否這個`tls`連接應被作為一個服務器或一個客戶端打開 的布爾值。 - requestCert: 一個表明了 是否服務器應該向連接的客戶端請求證書 的布爾值。只應用于服務器連接。 - rejectUnauthorized: 一個表明了 是否服務器應該拒絕包含不可用證書的客戶端 的布爾值。只應用于啟用了`requestCert`的服務器。 `tls.createSecurePair()`返回一個帶有`cleartext`和 `encrypted`流 屬性的對象。 注意:`cleartext`和`tls.TLSSocket`有相同的API。 #### Class: SecurePair 由`tls.createSecurePair`返回。 #### Event: 'secure' 當`SecurePair`成功建立一個安全連接時,`SecurePair`會觸發這個事件 與檢查服務器的`secureConnection`事件相似,`pair.cleartext.authorized`必須被檢查,來確認證書是否使用了合適的授權。 #### Class: tls.Server 這是一個`net.Server`的子類,并且與其有相同的方法。除了只接受源TCP連接,這個類還接受通過TLS或SSL加密的數據。 #### Event: 'secureConnection' - function (tlsSocket) {} 當一個新連接被成功握手后,這個事件會被觸發。參數是一個`tls.TLSSocket`實例。它擁有所有普通流擁有的事件和方法。 `socket.authorized`是一個表明了 客戶端是否通過提供的服務器CA來進行了認證 的布爾值。如果`socket.authorized`為`false`,那么`socket.authorizationError`將被設置用來描述授權失敗的原因。一個不明顯的但是值得提出的點:依靠TLS服務器的設定,未授權的連接可能會被接受。`socket.npnProtocol`是一個包含了被選擇的NPN協議的字符串。`socket.servernam`是一個包含了通過SNI請求的服務器名的字符串。 #### Event: 'clientError' - function (exception, tlsSocket) { } 當安全連接被建立之前,服務器觸發了一個`error`事件 - 它會被轉發到這里。 `tlsSocket`是錯誤來自的`tls.TLSSocket`。 #### Event: 'newSession' - function (sessionId, sessionData, callback) { } 在TLS會話創建時觸發。可能會被用來在外部存儲會話。`callback`必須最終被執行,否則安全連接將不會收到數據。 注意:這個事件監聽器只會影響到它被添加之后建立的連接。 #### Event: 'resumeSession' - function (sessionId, callback) { } 當客戶端想要恢復先前的TLS會話時觸發。事件監聽器可能會在外部通過`sessionId`來尋找會話,并且在結束后調用`callback(null, sessionData)`。如果會話不能被恢復(例如沒有找到),可能會調用`callback(null, null)`。調用`callback(err)`會關閉將要到來的連接并且銷毀`socket`。 注意:這個事件監聽器只會影響到它被添加之后建立的連接。 #### Event: 'OCSPRequest' - function (certificate, issuer, callback) { } 當客戶端發送一個證書狀態請求時觸發。你可以解釋服務器當前的證書來獲取OCSP url和證書id,并且在獲取了OCSP響應后執行`callback(null, resp)`,`resp`是一個`Buffer`實例。`certificate`和`issuer`都是一個`Buffer`,即主鍵和發起人證書的DER代表(DER-representations)。它們可以被用來獲取OCSP證書id 和 OCSP末端url。 另外,`callback(null, null)`可以被調用,意味著沒有OCSP響應。 調用`callback(err)`,將會導致調用`socket.destroy(err)`。 典型的流程: 1. 客戶端連接到服務器,然后發送一個`OCSPRequest`給它(通過`ClientHello`中擴展的狀態信息)。 1. 服務器接受請求,然后執行`OCSPRequest`事件監聽器(如果存在)。 1. 服務器通過證書或發起人抓取OCSP url,然后向CA發起一個OCSP請求。 1. 服務器從CA收到一個`OCSPResponse`,然后通過回調函數的參數將其返回給客戶端。 1. 客戶端驗證響應,然后銷毀`socket`或者進行握手。 注意:`issuer`可以是`null`,如果證書是自簽名的或`issuer`不在根證書列表之內(你可以通過`ca`參數提供一個`issuer`)。 注意:這個事件監聽器只會影響到它被添加之后建立的連接。 注意:你可能想要使用一些如`asn1.js`的`npm`模塊來解釋證書。 #### server.listen(port[, hostname][, callback]) 從指定的端口和主機名接收連接。如果`hostname`被忽略,服務器會在當IPv6可用時,接受任意IPv6地址(`::`)上的連接,否則為任意IPv4(`0.0.0.0`)上的。將`port`設置為`0`則會賦予其一個隨機端口。 這個函數是異步的。最后一個參數`callback`會在服務器被綁定后執行。 更多信息請參閱`net.Server`。 #### server.close([callback]) 阻止服務器繼續接收新連接。這個函數是異步的,當服務器觸發一個`close`事件時,服務器將最終被關閉。可選的,你可以傳遞一個回調函數來監聽`close`事件。 #### server.address() 返回綁定的地址,服務器地址的協議族名和端口通過操作系統報告。更多信息請參閱`net.Server.address()`。 #### server.addContext(hostname, context) 添加安全內容,它將會在如果客戶端請求的SNI主機名被傳遞的主機名匹配(可以使用通配符)時使用。`context`可以包含密鑰,證書,CA 和/或 其他任何`tls.createSecureContext`的`options`參數的屬性。 #### server.maxConnections 當服務器連接數變多時,設置這個值來拒絕連接。 #### server.connections 服務器上的當前連接數。 #### Class: CryptoStream > 穩定度: 0 - 棄用。 使用`tls.TLSSocket`替代。 這是一個加密流。 #### cryptoStream.bytesWritten 一個底層`socket`的`bytesWritten`存取器的代理,它會返回寫入`socket`的總字節數,包括TLS開銷。 #### Class: tls.TLSSocket 這是一個`net.Socket`的包裝,但是對寫入的數據做了透明的加密,并且要求TLS協商。 這個實例實現了一個雙工流接口。它有所有普通流所擁有的事件和方法。 #### Event: 'secureConnect' 在一個新連接成功握手后,這個事件被觸發。無論服務器的證書被授權與否,這個監聽器都會被調用。測試`tlsSocket.authorized`來 驗證服務器證書是否被一個指定CA所簽名 取決于用戶。如果`tlsSocket.authorized === false`那么錯誤可以從`tlsSocket.authorizationError`里被發現。如果`NPN`被使用,你可以通過`tlsSocket.npnProtocol`來檢查已協商協議。 #### Event: 'OCSPResponse' - function (response) { } 如果`requestOCSP`選項被設置,這個事件會觸發。`response`是一個`buffer`對象,包含了服務器的OCSP響應。 習慣上,`response`是一個來自服務器的CA(包含服務器的證書撤銷狀態)的已簽名對象。 #### tlsSocket.encrypted 靜態布爾變量,總是`true`。可能會被用來區分TLS `socket`和普通的`socket`。 #### tlsSocket.authorized 如果對等(peer)證書通過一個指定的CA被簽名,那么這個值為`true`。否則為`false`。 #### tlsSocket.authorizationError 對等(peer)的證書沒有被驗證的原因。這個值只在`tlsSocket.authorized === false`時可用。 #### tlsSocket.getPeerCertificate([ detailed ]) 返回了一個代表了對等證書的對象。返回的對象有一些屬性與證書的屬性一致。如果`detailed`參數被設置為`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() 返回一個代表了當前連接的加密器名和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重新協商過程。`optios`可以包含以下屬性:`rejectUnauthorized`,`requestCert`(詳情參閱`tls.createServer`)。一旦重協商成功,`callback(err)`會帶著`err`為`null`執行。 注意:可以被用來請求對等(peer)證書在安全連接建立之后。 另一個注意點:當作為服務器運行時,`socekt`在`handshakeTimeout`超時后,會帶著一個錯誤被銷毀。 #### tlsSocket.setMaxSendFragment(size) 設置TLS碎片大小的最大值(默認最大值為`16384`,最小值為`512`)。若設置成功返回`true`,否則返回`false`。 更小的碎片大小來減少客戶端的緩沖延遲:大的碎片通過TLS層緩沖,直到收到全部的碎片并且它的完整性被驗證;大碎片可能會跨越多次通信,并且可能會被報文丟失和重新排序所延遲。但是,更小的碎片增加了額外的TLS框架字節和CPU開銷,可能會減少總體的服務器負載。 #### tlsSocket.getSession() 返回`ASN.1`編碼的TLS會話,如果沒有被協商,返回`undefined`。可以被用在重新連接服務器時,加速握手的建立。 #### tlsSocket.getTLSTicket() 注意:僅在客戶端TLS `socket`中工作。僅在調試時有用,因為會話重新使用了給`tls.connect`提供的`session`選項。 返回TLS會話門票(ticket),如果沒有被協商,返回`undefined`。 #### tlsSocket.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 代表了本地端口的數字。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看