Node.js 10 HTTPS-сервер отклоняет соединения

У меня есть простой сервер Node.js HTTPS

const https = require('https');
const fs = require('fs');

const config = {
  key: fs.readFileSync('cert/server-key.pem'),
  cert: fs.readFileSync('cert/server-crt.pem'),
  ca: fs.readFileSync('cert/ca-crt.pem'),
};

const server = https.createServer(config, ((req, res) => {
  console.log('Got request');

  res.end();
}));

server.listen(3333);

Я использую curl на встроенной системе.

# curl -V
curl 7.52.1 (arm-unknown-linux-gnu) libcurl/7.52.1 wolfSSL/3.9.8
Protocols: file ftp ftps http https smtp smtps telnet tftp 
Features: IPv6 Largefile SSL UnixSockets  

Когда я использую Node.js, а затем версию 10, все работает хорошо.

Сервер HTTPS, работающий на Node.js v8.2.1

# curl -k -v "https://10.43.11.128:3333/"
*   Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
* SSL connected
> GET / HTTP/1.1
> Host: 10.43.11.128:3333
> User-Agent: curl/7.52.1
> Accept: */*

Сервер HTTPS, работающий на Node.js v10.1.0

# curl -k -v "https://10.43.11.128:3333/"
*   Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
* SSL_connect failed with error -313: revcd alert fatal error
* Curl_http_done: called premature == 1
* Closing connection 0
curl: (35) SSL_connect failed with error -313: revcd alert fatal error

Что изменилось в Node.js 10 в отношении HTTPS? Я подозреваю, что мне придется менять настройки SSL, но я точно знаю, как это сделать.


ОБНОВЛЕНИЕ:

Попытка доступа к HTTP (Node.js v10.1.0)

# curl --insecure -v "10.43.11.128:3333/"
*   Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
> GET / HTTP/1.1
> Host: 10.43.11.128:3333
> User-Agent: curl/7.52.1
> Accept: */*
> 
* Curl_http_done: called premature == 0
* Empty reply from server
* Connection #0 to host 10.43.11.128 left intact
curl: (52) Empty reply from server

Wireshark захватывает файл pcap.

Ответы

Ответ 1

Проблема в том, что клиент не поддерживает широковещательную поддержку набора или расширения шифрования, требуемого сервером.

Некоторые общие решения этой проблемы могут быть следующими: - При использовании ECC сервер требует, чтобы расширение поддерживаемых кривых было включено. Скомпилируйте wolfSSL с помощью "поддерживаемых кривых". - wolfSSL по умолчанию отключает статические блоки шифрования ключей по умолчанию. См. Примечание в верхней части README для получения инструкций по повторному включению наборов шифрования статического ключа, если ваш сервер требует их.

Вот нить, которая выдает ошибку, которую вы получили. Надеюсь, что это исправляет проблему

Ответ 2

Подтвердите, какие заголовки отправляются курсором, вы можете использовать для этого аргумент -v.

curl -v IX " https://10.43.11.128:3333/ "

также в узле,

просто console.log(req._headers) после req.end() и сравните свой заголовок, чтобы еще больше решить проблему. Также я прошу попробовать wirehark (http://www.wireshark.org/) для тестирования соединений ssl.

Поскольку он работает --insecure, но вам нужно знать причину.

--insecure

  • (SSL) Эта опция явно позволяет завитка выполнять "небезопасные" SSL-соединения и передачи. Все SSL-соединения пытались сделать безопасными, используя набор сертификатов CA, установленный по умолчанию. Это заставляет все соединения считаться "небезопасными", если не используются -k, --insecure.

Также вы можете попробовать это

const https = require("https"),
  fs = require("fs");

const options = {
  key: fs.readFileSync("/cert/server-key.pem"),
  cert: fs.readFileSync("/cert/server-cert.pem")
};

const app = express();

app.use((req, res) => {
  res.writeHead(200);
  res.end("hello world\n");
});

app.listen(8000);

https.createServer(options, app).listen(8080);