提问者:小点点

在节点JS TLS中从SSLv3(DHE-RSA-AES256-SHA)添加/启用密码到TLS 1.2


我有一个我无法控制的医疗设备(客户端)。当设备(客户端)上发生事件时,它通过TLSv1.2连接到我的服务器以传递数据。我的错误是“没有共享密码”。

[错误:3160:错误:1417A0C1:SSL例程:tls_post_process_client_hello:没有共享密码:openssl\ssl\statem\statem_srvr.C:1419:]

经过长时间的调查,似乎在node JS10.9.0中不支持客户端密码套件。我尝试覆盖默认密码(DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA.参见下面的代码),并且考虑了该更改,因为我尝试连接openssl s_client,但由于它不支持这些密码而失败。如果我将密码设置为ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA,则openssl s_client连接。如果我在列表中执行openssl Ciphers-SSLv3,我会看到DHE-RSA-AES128-SHA和DHE-RSA-AES256-SHA。但客户端不连接。

我的服务器代码:

null

const tls = require('tls');
const fs = require('fs');

tls.DEFAULT_CIPHERS = 'DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA';

const options = {
    key: fs.readFileSync(__dirname + '\\cert\\private-key.pem'),
    cert: fs.readFileSync(__dirname + '\\cert\\cert.pem'),
    rejectUnauthorized: false
};

const server = tls.createServer(options, (socket) => {
    console.log('server connected',
        socket.authorized ? 'authorized' : 'unauthorized');

    socket.write('welcome!\n');
    socket.setEncoding('utf8');
    socket.pipe(socket);
});

server.on('tlsClientError', (error, tlsSocket) => {
    console.log(error);
});

server.listen(8081, () => {
    console.log('server bound', 8011);
});

null

Openssl s_client

我如何添加或解决这些旧密码?

**新选项**

const options = {
key: fs.readFileSync(__dirname + '/cert/sentinel-private-key.pem'),
cert: fs.readFileSync(__dirname + '/cert/sentinel-cert.pem'),
dhparam: fs.readFileSync(__dirname + '/cert/dhparams.pem'),
ca:  [fs.readFileSync(__dirname + '/cert/ca-cert.ca')],
rejectUnauthorized: false

共1个答案

匿名用户

客户端要求您的服务器使用基于DHE的密码套件支持完美的前向保密。为了实现这一点,您需要使用适当的DH参数配置服务器。

首先,您必须生成您的参数,例如:

 openssl dhparam -out dhparams.pem 2048

接下来,您需要配置应用程序来使用它们。在nodes.js中执行此操作的说明可在以下站点获得:

https://nodejs.org/docs/latest-v10.x/api/Tls.html#TLS_Perfect_Forward_Secrecy