Создание SSL-сертификатов для использования с Node.js

Мне нужно запустить локальный экспресс-сервер по протоколу https. Я использовал инструкции с сайта это и подобные. Но когда я пытаюсь открыть страницу в браузере, я получаю ошибку Your connection is not private. Когда я открыл вкладку Security из Developer tools, я увидел ошибку This site is missing a valid, trusted certificate (net::ERR_CERT_INVALID). Когда я попытался отправить запрос через Postman, мой сервер не ответил, и запрос curl возвращает:

curl: (60) SSL certificate problem: unable to get local issuer certificate

Вот код сервера:

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

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

app.get('/', (req, res) => {
  res.send('hello world');
});

https
  .createServer(options, app)
  .listen(3000, '127.0.0.1', () => {
    console.info('Run on: https://127.0.0.1:3000');
  });

Я создал сертификаты с помощью следующей команды:

$ openssl req -nodes -sha256 -new -x509 -keyout key.pem -out cert.pem -days 365 -config req.cnf

где req.cnf файл имеет следующее содержимое:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = 127.0.0.1:3000
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = IP:127.0.0.1:3000

Пробовал использовать и порт 443, но, к сожалению, те же ошибки. Так же пытался открыть страницу https://127.0.0.1:3000 в режиме Инкогнито - ничего не вышло - ошибки те же.

Мои вопросы:

  1. Где я ошибаюсь в создании сертификатов?
  2. Почему я не могу отправить запрос на свой сервер через Postman/curl?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 759
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы создали, — это самозаверяющий сертификат, по умолчанию ни одно сетевое приложение не примет их, поскольку они не могут их проверить, поэтому они предполагают худшее (атака MITM).

Если вам это нужно только для локальной проверки, вы можете следовать этому Получение Chrome для принятия самозаверяющего сертификата localhost

Ошибка почтальона, вероятно, является эквивалентной ошибкой для приложений Chrome.

Как я понял, нужно добавить строчку subjectAltName = DNS:*.example.com под [ v3_ca ] (по ссылке из вашего ответа)? Но я сделал это. Просто я использовал IP и порт вместо DNS. К сожалению, мне это не помогло.

Vitalii 07.04.2019 11:22

@vitalii просто посмотрите, что ссылка указывает на один из ответов в посте по ошибке (исправлено), я имел в виду первый (набравший наибольшее количество голосов) ответ (изменение флага chrome #allow-insecure-localhost), у меня был успех с ним в прошлом с локальные тесты

Shachar 07.04.2019 13:09

Спасибо. Но если я сделаю эту рекомендацию, я исправлю свою проблему только для браузера. А как насчет Postmen/curl (curl очень важен!)? Я имею в виду, если у меня не будет браузера и какого-либо пользовательского интерфейса (в моем случае на сервере Debian), как я могу решить проблему? Является ли это возможным?

Vitalii 07.04.2019 15:17

Почтальон @vitalii работает в Chrome и должен соблюдать те же настройки, у curl есть собственная настройка -k для разрешения самозаверяющих сертификатов, вы ничего не можете сделать с фактическим сертификатом (кроме покупки настоящего), что позволит его использовать как- является

Shachar 07.04.2019 17:11

Думаю, я понял этот момент, и на данный момент все ясно. Еще раз спасибо за ваши ответы!

Vitalii 08.04.2019 19:25

Другие вопросы по теме