2

この質問に関連して、node.js で TLS サーバーを起動して、OpenSSL で作成したものを反映しようとしています。コマンド ラインから OpenSSL を使用してクライアントとサーバーをテストしたところ、正常に接続されました。サーバーを node.js に移植しようとすると (さらに OpenSSL クライアントを使用して接続しようとすると)、「共有暗号がありません」というエラーが表示されます。passphraseオプションを使用するときに何か特別なことをする必要があるかどうか疑問に思っていますtls.createServer()

以下は、サーバーとクライアントのそれぞれで成功した 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作成された CA で生成および署名された楕円曲線キーを使用しています。openssl 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 を使用しています。また、に送信されたオプション リストのciphersrequestCert、およびのコメントを外しても、エラーは変わりません。クライアントの node.js 接続もあり、ノード サーバーに接続しようとするとソケット ハングアップ コード ECONNRESET が表示され、OpenSSL サーバーに接続しようとすると次のエラーが表示されます。rejectUnauthorizedtls.createServer()

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:
]

あなたの助けとアイデアを前もってありがとう!

4

1 に答える 1

0

パスフレーズが間違っている場合は、おそらく。削除してみてください。

ただし、no_shared_cipherは、クライアントがサーバーとの暗号化スーツに同意できない場合に発生するエラーです。最初にサーバー上の暗号スーツの制限を削除し、問題を切り分けるために使用するネゴシエーションを確認してください。これが機能する場合は、クライアントに配置して、何が起こるかを確認してください。

また、ノードが openssl コマンドと同じ openssl ライブラリを使用していることを確認できますか。

于 2012-04-18T01:03:06.383 に答える