Использование Node кодовой фразы JS TLS и параметров шифрования при создании сервера и клиента с использованием клавиш эллиптической кривой (ошибка общих ошибок шифрования)

77
10

В отношении этот вопрос, я пытаюсь запустить сервер TLS в node.js, чтобы отразить тот, который я создал в 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 в командной строке я получаю следующие сообщения.


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

Я использую node v0.6.15. И ошибки не меняются, когда я раскомментирую ciphers, requestCert и rejectUnauthorized в списке параметров, отправленном на tls.createServer(). У меня также есть node.js cersion клиента, и я получаю код зависания сокета ECONNRESET, когда пытаюсь подключиться к серверу node, и следующую ошибку при попытке подключиться к серверу 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:
]

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

спросил(а) 2021-01-25T16:30:38+03:00 4 месяца, 3 недели назад
1
Решение
116

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


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

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

ответил(а) 2021-01-25T16:30:38+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема