我有一个我无法控制的医疗设备(客户端)。当设备(客户端)上发生事件时,它通过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
客户端要求您的服务器使用基于DHE的密码套件支持完美的前向保密。为了实现这一点,您需要使用适当的DH参数配置服务器。
首先,您必须生成您的参数,例如:
openssl dhparam -out dhparams.pem 2048
接下来,您需要配置应用程序来使用它们。在nodes.js中执行此操作的说明可在以下站点获得:
https://nodejs.org/docs/latest-v10.x/api/Tls.html#TLS_Perfect_Forward_Secrecy