#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 Да, я обновил свой ответ. Пожалуйста, проверьте это