Я хочу создать самоподписанный сертификат для сервера 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 от французского)
Любая помощь приветствуется, потратил день на проблему! Спасибо!