Что касается 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:
]
Заранее благодарим за помощь и идеи!
Я попробую без кодовой фразы и посмотрю, работает ли это, хотя я перешел на использование файла, содержащего пароль в обоих узлах, и openssl, чтобы избежать несогласованности парольной фразы между тестами. В моем текущем тесте не используется ограничение на шифрование - я прокомментировал его вместе с ограничениями на отказ клиентов без сертификатов (requireCert и rejectUnauthorized). Таким образом, он, кажется, отвергает все связи. Я полностью удалил прокомментированные строки и снова попытался, но получил ту же ошибку. Я попытаюсь выяснить, использует ли мой узел другую версию openssl. Благодаря! – aspergillusOryzae
Я также должен добавить, что 'openssl s_client -connect 127.0.0.1: 8888' также дает ошибку сотрясения руки, и мой сервер ранее работал, когда я использовал RSA-сертификаты (подписанные локальным ЦС) для сервера. И я обнаружил, что в Интернете не было примеров tls.createServer(), в которых использовались шифры и фразы. – aspergillusOryzae
Обновление, я обнаружил следующее при вызове '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