使用椭圆曲线键创build服务器和客户机时使用节点JS TLS密码和密码选项(不共享密码套件错误)

关于这个问题 ,我试图在node.js中启动一个TLS服务器,以反映我在OpenSSL中创build的服务器。 我已经从命令行使用OpenSSLtesting了客户端和服务器,并成功build立连接。 当我尝试将服务器移植到node.js(并且仍然使用OpenSSL客户端连接到服务器)时,我收到一个“no shared cipher”错误。 我想知道是否有什么特别的我需要做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创build的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版本,当我尝试连接到节点服务器时,我得到一个套接字挂起代码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库。