Мне нужно запустить локальный экспресс-сервер по протоколу 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
в режиме Инкогнито - ничего не вышло - ошибки те же.
Мои вопросы:
То, что вы создали, — это самозаверяющий сертификат, по умолчанию ни одно сетевое приложение не примет их, поскольку они не могут их проверить, поэтому они предполагают худшее (атака MITM).
Если вам это нужно только для локальной проверки, вы можете следовать этому Получение Chrome для принятия самозаверяющего сертификата localhost
Ошибка почтальона, вероятно, является эквивалентной ошибкой для приложений Chrome.
@vitalii просто посмотрите, что ссылка указывает на один из ответов в посте по ошибке (исправлено), я имел в виду первый (набравший наибольшее количество голосов) ответ (изменение флага chrome #allow-insecure-localhost
), у меня был успех с ним в прошлом с локальные тесты
Спасибо. Но если я сделаю эту рекомендацию, я исправлю свою проблему только для браузера. А как насчет Postmen/curl (curl очень важен!)? Я имею в виду, если у меня не будет браузера и какого-либо пользовательского интерфейса (в моем случае на сервере Debian), как я могу решить проблему? Является ли это возможным?
Почтальон @vitalii работает в Chrome и должен соблюдать те же настройки, у curl есть собственная настройка -k
для разрешения самозаверяющих сертификатов, вы ничего не можете сделать с фактическим сертификатом (кроме покупки настоящего), что позволит его использовать как- является
Думаю, я понял этот момент, и на данный момент все ясно. Еще раз спасибо за ваши ответы!
Как я понял, нужно добавить строчку
subjectAltName = DNS:*.example.com
под[ v3_ca ]
(по ссылке из вашего ответа)? Но я сделал это. Просто я использовал IP и порт вместо DNS. К сожалению, мне это не помогло.