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

Posted

技术标签:

【中文标题】在 Node JS TLS 中添加/启用从 SSLv3 (DHE-RSA-AES256-SHA) 到 TLS 1.2 的密码【英文标题】:Add/Enable cipher from SSLv3 (DHE-RSA-AES256-SHA) to TLS 1.2 in Node JS TLS 【发布时间】:2020-01-02 11:34:56 【问题描述】:

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

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

经过长期调查,node js 10.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。但是客户端没有连接。

连接握手

我的服务器代码:

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

Openssl s_client

密码 ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA

密码 DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA

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

编辑新回复:

** 新选项 **

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

【讨论】:

谢谢,你怎么知道客户想要前向保密?现在握手发生了,服务器响应你好,然后客户端响应内部错误 80,我添加了一个客户端 CA,我可以从 p12 通过 Web 界面在客户端上生成它。现在我得到:证书未知(46)。也许是因为我使用自签名? 您可以在 ClientHello 的 wireshark 转储中看到,提供的唯一两个 cipersuite 是 DHE 的。基于 DHE(和 ECDHE)的密码套件的一个关键特性是完美的前向保密。 WRT到您的其他问题很可能您使用的自签名证书不受客户端信任。

以上是关于在 Node JS TLS 中添加/启用从 SSLv3 (DHE-RSA-AES256-SHA) 到 TLS 1.2 的密码的主要内容,如果未能解决你的问题,请参考以下文章

Node.js(十三)——Promise重构爬虫代码

使用Node.js中的TLS / SSL隐式加密连接到FTP服务器

在SuperSocket中启用TLS/SSL传输层加密

配置postfix和dovecot启用SSL以加密连接

如何解决这个问题:“请确保在“Internet”选项控制面板中已启用SSL 3.0或TLS 1.0”???

如何将 Apache 2.4 配置从 SSL 支持更改为 TLS