Узел, не соблюдающий параметры tls

#javascript #c #node.js #security #ssl

Вопрос:

У меня есть самокомпилируемая версия Nodejs, но я все еще могу воспроизвести эти проблемы в nodejs v15.8.0 . Я пытаюсь изменить подпись приветствия моего клиента, но, похоже, nodesj не позволяет мне это сделать.

У меня есть следующий сценарий.

 const tls = require('tls'),
   crypto = require('crypto');

let ciphers = [
   //'3a3a',
   //'GREASE-0A0A',
   'TLS_AES_128_GCM_SHA256',
   'TLS_CHACHA20_POLY1305_SHA256',
   'TLS_AES_256_GCM_SHA384',
   'ECDHE-ECDSA-AES128-GCM-SHA256',
   'ECDHE-RSA-AES128-GCM-SHA256',
   'ECDHE-ECDSA-CHACHA20-POLY1305',
   'ECDHE-RSA-CHACHA20-POLY1305',

   'ECDHE-ECDSA-AES256-GCM-SHA384',
   'ECDHE-RSA-AES256-GCM-SHA384',

   'ECDHE-ECDSA-AES256-SHA',
   'ECDHE-ECDSA-AES128-SHA',

   'ECDHE-RSA-AES128-SHA',
   'ECDHE-RSA-AES256-SHA',
   'AES128-GCM-SHA256',
   'AES256-GCM-SHA384',
   'AES128-SHA',
   'AES256-SHA',
   'DES-CBC3-SHA',
   'AES128-GCM-SHA256',
   'AES256-GCM-SHA384',
   'DES-CBC3-SHA', //
   //'-TLS_EMPTY_RENEGOTIATION_INFO_SCSV',
];

let cipher_list = ciphers.join(':');

const sigalgs = [
   'ecdsa_secp256r1_sha256',
   'ecdsa_secp384r1_sha384',
   'ecdsa_secp521r1_sha512',
   'rsa_pss_rsae_sha256',
   'rsa_pss_rsae_sha384',
   'rsa_pss_rsae_sha512',
   'rsa_pkcs1_sha256',
   'rsa_pkcs1_sha384',
   'rsa_pkcs1_sha512',
   //'ecdsa_sha1',
   //'rsa_pkcs1_sha1',
];

let sigalgs_list = sigalgs.join(':');

const socket = tls.connect({
    host: 'webpage.com',
    port: 443,
    servername: 'webpage.com',
    ciphers: cipher_list,
    sigalgs: sigalgs_list,
    secureOptions: //crypto.constants.SSL_OP_NO_RENEGOTIATION
        //|
        //455555|
        //crypto.constants.SSL_OP_NO_TICKET
        //crypto.constants.SSL_OP_NO_SSLv2
        //| crypto.constants.SSL_OP_NO_SSLv3
        crypto.constants.SSL_OP_NO_COMPRESSION
        | crypto.constants.SSL_OP_NO_RENEGOTIATION
        //| crypto.constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION //doesn't make any effect ?
        | 0x00000010 //crypto.constants.SSL_OP_TLSEXT_PADDING
        //| crypto.constants.SSL_OP_ALL
        //| crypto.constants.SSLcom
    ,
    ALPNProtocols:  ['h2', 'http/1.1'],
    minVersion: 'TLSv1.2',
    requestOCSP: true,
 });

 socket.on('secureConnect', () => console.log('connected to', socket.remoteAddress));

 

Из моего кода я ожидаю, что nodejs изменит мой клиентский привет, чтобы включить указанные наборы шифров и указанные алгоритмы подписи, но nodejs этого не делает. Фактически, включение «ecdsa_sha1» в список алгоритмов подписи вызывает возможную ошибку

 node:_tls_common:237
    c.context.setSigalgs(sigalgs);
              ^

Error: error:00000000:lib(0):func(0):reason(0)
    at Object.createSecureContext (node:_tls_common:237:15)
    at Object.connect (node:_tls_wrap:1614:48)
    at Object.<anonymous> (/home/ghoul/Node/script.js:52:20)
    at Module._compile (node:internal/modules/cjs/loader:1092:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1121:10)
    at Module.load (node:internal/modules/cjs/loader:972:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
    at node:internal/main/run_main_module:17:47
 

Возможно ли, что я упускаю что-то простое?

Я наблюдаю, как мой клиент здоровается через wireshark, не похоже, что nodejs уважает какую-либо часть конфигурации.

Комментарии:

1. SHA-1 больше не считается безопасным, особенно когда дело доходит до генерации подписи. Поэтому я предполагаю, что это проверяется библиотекой. Так что тот факт, что SHA-1 не работает, вероятно, не имеет отношения к делу.