Самоподписанный SSL-сертификат на частном IP-адресе недействителен в Chrome - PullRequest
0 голосов
/ 07 января 2019

Я хочу создать самоподписанный сертификат для сервера nodejs. Я запускаю его из macOS. Я хочу иметь возможность посещать страницы, отображаемые этим сервером через https, с другого устройства (Android) в той же сети Wi-Fi через "https://192.9.200.77:8005" в Chrome. 192.9.200.77 - это IP-адрес сервера.

Мне удалось создать ключ и сертификат с OpenSSL с SAN. Я установил сертификат на устройстве Android и на MacOS.

В MacOS сертификат работает в Safari, но не в Chrome 71.

На Android сертификат тоже не работает.

app.js (сервер узла):

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

const credentials = {
  key: fs.readFileSync('keys/priv_and_pub.pem'),
  cert: fs.readFileSync('keys/CA.crt')
};
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => res.send('Hello World!'));

const httpsServer = https.createServer(credentials, app);

httpsServer.listen(8005, () => console.log(`Example app listening on port 8005 in https!`));

Для создания сертификата я использую файл конфигурации:

ssl.conf

[ req ]
x509_extensions     = x509_ext
distinguished_name  = subject


[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = California

localityName            = Locality Name (eg, city)
localityName_default    = SF

organizationName         = Organization Name (eg, company)
organizationName_default    = my company

commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = 192.9.200.77

emailAddress            = Email Address
emailAddress_default        = myadress@domaine.com

[ x509_ext ]
basicConstraints        = CA:TRUE
subjectAltName          = @alternate_names

[ alternate_names ]

DNS.1       = 192.9.200.77

И Openssl с этими командами:

openssl genrsa -out priv_and_pub.key 2048

openssl req -config ssl.conf -new -x509 -sha256 -key priv_and_pub.key -subj "/C=US/ST=California/L=BSF/O=myCompany/OU=Prod/CN=192.9.200.77"  -out CA.crt 

Затем я конвертирую сертификат в формат DER для устройства Android в соответствии с рекомендациями здесь :

openssl x509 -inform PEM -outform DER -in CA.crt -out CA.der.crt

И преобразовал priv_and_pub.key в .pem для сервера узла:

cp priv_and_pub.key priv_and_pub.pem

app.js работает нормально. Я установил .cert в macOS и все нормально в Safari (зеленая блокировка и все), но не работает в Chrome: (net::ERR_CERT_COMMON_NAME_INVALID). В консоли браузера на вкладке «Безопасность» я получаю зеленые знаки для соединения (Соединение - безопасный (сильный TLS 1.2)) и ресурсы (ресурсы - все обслуживаются безопасно), но красный флаг для сертификата (сертификат - отсутствует) и эта ошибка: «Невозможно проверить на сервере, что это домен 192.9.200.77, поскольку его сертификат безопасности исходит из домена 192.9.200.77. Это может быть связано с неправильной настройкой или подключением вашего хакера. ' (Google Traduction от французского)

Любая помощь приветствуется, потратил день на проблему! Спасибо!

1 Ответ

0 голосов
/ 18 февраля 2019

Я решил свою проблему, изменив subjectAltName в файле ssl.conf, добавив IP: перед IP-адресом:

ssl.conf файл:

[ x509_ext ]
basicConstraints        = CA:TRUE
subjectAltName          = IP:192.9.200.77

и я также удалил раздел [ alternate_names ].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...