簡體   English   中英

使用橢圓曲線密鑰創建服務器和客戶端時,使用Node JS TLS密碼和密碼選項(無共享密碼套件錯誤)

[英]Using Node JS TLS passphrase and cipher options when creating a server and client using elliptic curve keys (no shared cipher suites error)

關於此問題 ,我試圖在node.js中啟動TLS服務器以反映我在OpenSSL中創建的TLS服務器。 我已經從命令行使用OpenSSL測試了客戶端和服務器,它們成功建立了連接。 當我嘗試將服務器移植到node.js時(仍然通過OpenSSL客戶端連接到它),我收到“沒有共享密碼”錯誤。 我想知道在與tls.createServer()一起使用passphrase選項時是否需要做一些特別的事情

以下是我分別用於服務器和客戶端的成功的OpenSSL命令,請注意,passphrase.txt文件包含一行,即密碼短語:

$ openssl s_server -accept 8888 -cert server.cert -key server.key -pass file:passphrase.txt -CAfile ca.cert
$ openssl s_client -connect 127.0.0.1:8888 -cert client.cert -key client.key -pass file:passphrase.txt -CAfile ca.cert

如果我使用-cipher 'ECDHE-ECDSA-AES128-GCM-SHA256'的附加參數為客戶端和/或服務器指定密碼,則也可以成功建立連接。 我使用的是由openssl ecparam生成的橢圓曲線鍵,並使用通過openssl ca創建的CA進行簽名,如上一個問題所述

用node.js編寫的服務器代碼如下所示:

var tls = require('tls');
var fs = require('fs');
var msg = '***********\n\nHello there secure client!\n\n***********';
var port = 8888;
var host = 'localhost'; 

var options = {
    cert : fs.readFileSync('server.cert'),
    key : fs.readFileSync('server.key'),
    passphrase :  (fs.readFileSync('passphrase.txt')).toString(),
    ca : fs.readFileSync('ca.cert'),

//  ciphers: 'ECDHE-ECDSA-AES128-GCM-SHA256',
//  requestCert : true,
//  rejectUnauthorized : true
};

tls.createServer(options, function(cleartextStream) {
    if (cleartextStream.authorized) {
        console.log('Server-side connection authorized by a Certificate Authority.');
    } else {
        // TODO this code does not appear to get executed even on failed connections
        console.log('Server-side connection not authorized: ' + cleartextStream.authorizationError);
    }

    // send the server message to the client
    cleartextStream.write(msg);
    cleartextStream.setEncoding('utf8');
    cleartextStream.pipe(cleartextStream);
}).listen(port, function() {
    console.log('Server started on port: ' + port);
}).on('clientError', function(err){
    console.log('A failed client connection attempt occurred.');
    console.error(err);
    console.log();
});

在使用node tlsServer.js調用上述代碼並嘗試在命令行上與OpenSSL客戶端連接后,我收到以下消息。

服務器:

$ node tlsServer.js
Server started on port: 8888

<< client started here >>

A failed client connection attempt occurred.
[Error: 6396:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:openssl\ssl\s3_srvr.c:1132:
]

客戶:

$ openssl s_client -connect 127.0.0.1:8888 -cert client.cert -key client.key -pass file:passphrase.txt -CAfile ca.cert
CONNECTED(00000003)
2674688:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 320 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

我正在使用節點v0.6.15。 當我取消注釋發送到tls.createServer()的選項列表中的ciphersrequestCertrejectUnauthorized時,錯誤不會更改。 我還有客戶端的node.js cersion,嘗試連接到節點服務器時收到套接字掛起代碼ECONNRESET,而嘗試連接到OpenSSL服務器時出現以下錯誤:

Connection to localhost:8888 could not be made.
[Error: 6968:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:openssl\ssl\s23_clnt.c:602:
]

預先感謝您的幫助和想法!

如果密碼錯誤,也許可以。 嘗試將其刪除。

但是,當客戶端無法與服務器協商密碼時, no_shared_cipher會引發錯誤。 嘗試首先刪除服務器上的密碼套件限制,然后查看服務器協商使用什么來隔離問題。 如果可行,則與客戶放在一起,看看會發生什么。

另外,您是否可以檢查節點是否使用與openssl命令相同的openssl庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM