Процедуры настройки узла: tls_process_ske_dhe: ключ dh слишком мал

#node.js #docker

#node.js #docker

Вопрос:

Я искал эту ошибку в течение последних двух дней, но ни одно из решений, похоже, не помогает.

Я создал простой сервер NodeJS, который выполняет внешний вызов API с помощью axios.

 const loadCerts() => {
    const sslDir: string = join(process.cwd(), 'ssl');
    const certFilenames: string[] = readdirSync(sslDir).filter(filename => filename.endsWith('.cer'));
      
    console.log(`Loaded the following SSL certificates: ${certFilenames.join(', ')}`);
      
    return certFilenames.map(filename => readFileSync(`${sslDir}/${filename}`));
}

const httpAgent = new https.Agent({
    rejectUnauthorized: false,
    ca: loadCerts(),
})

const response = await axios.post(`https://api.company.com`, params, {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    httpsAgent: this.httpAgent
});
 

При локальном тестировании все работает так, как ожидалось. Однако, когда я развернул это как образ Docker, я начал испытывать некоторые странные поведения. Затем я протестировал свой образ docker локально, и произошло то же самое.

Я вижу эту неясную ошибку: Error: write EPROTO 140605946637248:error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small:ssl/statem/statem_clnt.c:2150:

Сама ошибка мне мало что говорит, поиск в Google дал мне только такие предложения, как обновление версии моего узла (я использую v14). Я использую ту же версию узла на своем локальном компьютере и в образе Docker.

Я подозреваю, что это может иметь какое-то отношение к самому образу Docker, мне не хватает каких-то зависимостей там?

Редактировать:

В другом Java-проекте, где я использую тот же API, в Dockerfile есть этот дополнительный шаг, я предполагаю, что мне нужно сделать что-то подобное для моего образа node Docker.

RUN sed -i 's/DH keySize < 2048/DH keySize < 1024/g' /etc/crypto-policies/back-ends/java.config

Ответ №1:

Я решил эту проблему в своем проекте с помощью 2 шагов:

1. Измените настройки Docker SSL

Я редактировал /etc/ssl/openssl.cnf внутри контейнера

Замена строк:

 TLSv1.2 => TLSv1
SECLEVEL=2 => SECLEVEL=1
 

Вы можете сделать это, отредактировав Dockerfile, добавьте эти 2 строки :

 RUN sed -i "s/TLSv1.2/TLSv1/g" /etc/ssl/openssl.cnf amp;amp; 
    sed -i "s/SECLEVEL=2/SECLEVEL=1/g" /etc/ssl/openssl.cnf
 

PS: проверьте свою версию TLS и значение SECLEVEL, если они не совпадают с указанным выше аргументом команды modify sed

2. Установите минимальную версию TLS для вашего запроса

 import * as https from 'https';

const agent = new https.Agent({
  rejectUnauthorized: false,
  minVersion: 'TLSv1',
});

const response = await axios.post(`<YOUR_URL>`, params, {
  httpsAgent: this.httpAgent
});
 

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

1. Вы случайно не знаете способ сделать это автоматически в процессе сборки? Или всякий раз, когда я перестраиваю свой образ, мне приходится делать это снова.

2. @OmarOmeiri Да, я обновил свой ответ. Пожалуйста, проверьте это