2012-04-18 7 views
2

Что касается this question, я пытаюсь запустить сервер TLS в узле.js, чтобы отразить тот, который я созданный в OpenSSL. Я проверил клиент и сервер с помощью OpenSSL из командной строки, и они успешно создали соединение. Когда я пытаюсь перенести сервер на node.js (и все еще подключаюсь к нему с клиентом OpenSSL), я получаю ошибку «без общего шифрования». Я интересно, если есть что-то особенное, что нужно сделать при использовании опции passphrase с tls.createServer()Использование параметров кодовой фразы и шифрования Node JS при создании сервера и клиента с использованием клавиш эллиптической кривой (ошибка общих ошибок шифрования)

Ниже приведен командами моя успешная 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, как описано в моем previous question.

Серверный код написан на 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 в командной строке, я получаю следующие сообщения.

SERVER:

$ 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. И ошибки не меняются, когда я раскомментирую ciphers, requestCert и rejectUnauthorized в списке опций, отправленном на номер tls.createServer(). У меня также есть 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: 
] 

Заранее благодарим за помощь и идеи!

ответ

0

Если кодовая фраза неверна, может быть. Попробуйте удалить его.

Тем не менее, no_shared_cipher - это ошибка, возникшая, когда клиент не может договориться о шифровом костюме с сервером. Попробуйте сначала удалить ограничение на шифрование на сервере и посмотреть, что он обсуждает, чтобы изолировать проблему. Если это сработает, разместите его с клиентом и посмотрите, что произойдет.

Кроме того, вы можете проверить, что узел использует ту же библиотеку openssl, что и команда openssl.

+0

Я попробую без кодовой фразы и посмотрю, работает ли это, хотя я перешел на использование файла, содержащего пароль в обоих узлах, и openssl, чтобы избежать несогласованности парольной фразы между тестами. В моем текущем тесте не используется ограничение на шифрование - я прокомментировал его вместе с ограничениями на отказ клиентов без сертификатов (requireCert и rejectUnauthorized). Таким образом, он, кажется, отвергает все связи. Я полностью удалил прокомментированные строки и снова попытался, но получил ту же ошибку. Я попытаюсь выяснить, использует ли мой узел другую версию openssl. Благодаря! – aspergillusOryzae

+0

Я также должен добавить, что 'openssl s_client -connect 127.0.0.1: 8888' также дает ошибку сотрясения руки, и мой сервер ранее работал, когда я использовал RSA-сертификаты (подписанные локальным ЦС) для сервера. И я обнаружил, что в Интернете не было примеров tls.createServer(), в которых использовались шифры и фразы. – aspergillusOryzae

+0

Обновление, я обнаружил следующее при вызове 'process.versions' из node.exe в строке cmd окон' {node: '0.6.15', v8: '3.6.6.24', ares: '1.7.5-DEV' , uv: '0,6', openssl: '0.9.8r'} ', поэтому похоже, что мой openssl устарел. – aspergillusOryzae