utwórz zaufany certyfikat SSL z podpisem własnym dla hosta lokalnego (do użytku z Express / Node)

130

Próbując postępować zgodnie z różnymi instrukcjami dotyczącymi tworzenia certyfikatu z podpisem własnym do użytku z hostem lokalnym. Większość instrukcji wydaje się być przeznaczona dla usług IIS, ale próbuję użyć Nodejs / Express. Żaden z nich nie działa poprawnie, ponieważ po zainstalowaniu certyfikatu nie jest zaufany. oto, co próbowałem, ale zawiodło:

Czy ktoś może zaoferować przepływ pracy, który może to zrobić? Mogę zainstalować certyfikat, ale nie mogę uzyskać zaufania ani w Chrome (v32), ani w IE (v10).

EDYCJA: zasugerowano w komentarzach, że problem nie dotyczy zaufanego katalogu głównego. Zainstalowałem certyfikat przez IE, ale nadal nie jest on zaufany.

JasonS
źródło
Żaden z certyfikatów z podpisem własnym nie może być zaufany dla przeglądarek internetowych. Nie są podpisane przez zaufane organy podpisujące.
1
to nieprawda: możesz zainstalować certyfikat główny, aby uzyskać zaufany certyfikat z podpisem własnym. jednak wydaje mi się, że nie mogę tego zrobić poprawnie. Czytałem, że łańcuch certyfikatów można zainstalować w IE (nie w chrome), więc próbowałem, ale nadal nie jest rozpoznawany. Nie wiem, czy dzieje się tak, ponieważ localhost jest specjalny, czy też certyfikat z podpisem własnym jest po prostu nieprawidłowy.
JasonS
3
Nigdy nie otrzymałem certyfikatu z podpisem własnym działającego z przeglądarkami takimi jak Chrome. Oto moje obejście: utworzyłem wpis DNS dla local.MYDOMAIN.com wskazujący na 127.0.0.1 (localhost), a następnie po prostu użyłem mojego certyfikatu produkcyjnego. Ma to dodatkową zaletę w postaci upewnienia się, że nie ma problemów z łańcuchem certyfikatów produkcji itp.
JasonS

Odpowiedzi:

86

Powyższe odpowiedzi były częściowe. Spędziłem tyle czasu, żeby to działało, to szaleństwo. Uwaga dla mojego przyszłego ja, oto co musisz zrobić:

Pracuję na Windows 10, z Chrome 65. Firefox zachowuje się ładnie - wystarczy potwierdzić localhost jako wyjątek bezpieczeństwa i będzie działać. Chrome nie:

Krok 1. W swoim zapleczu utwórz folder o nazwie security. będziemy w nim pracować.

Krok 2. Utwórz plik konfiguracyjny żądania o nazwie req.cnfz następującą zawartością (autorstwo: @Anshul )

req.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = Country initials like US, RO, GE
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost

Objaśnienie tych pól znajduje się tutaj .

Krok 3. Przejdź do folderu zabezpieczeń w terminalu i wpisz następujące polecenie:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config req.cnf -sha256

Krok 4. następnie poza securityfolderem, w aplikacji ekspresowej zrób coś takiego: (autorstwo: @Diego Mello)

backend 
 /security
 /server.js

server.js:

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
    res.send("IT'S WORKING!")
})

const httpsOptions = {
    key: fs.readFileSync('./security/cert.key'),
    cert: fs.readFileSync('./security/cert.pem')
}
const server = https.createServer(httpsOptions, app)
    .listen(port, () => {
        console.log('server running at ' + port)
    })

Krok 5. Uruchom serwer node server.jsi przejdź do https: // localhost: 3000 .

W tym momencie mamy konfigurację serwera. Ale przeglądarka powinna wyświetlić komunikat ostrzegawczy.

Musimy zarejestrować nasz samopodpisany certyfikat jako zaufany urząd certyfikacji CA w magazynie certyfikatów Chrome / Windows. (Chrome również zapisuje to w oknach)

Krok 6. Otwórz Dev Tools w chrome, przejdź do panelu Security, a następnie kliknij View Certificate. wprowadź opis obrazu tutaj

Krok 7. Przejdź do panelu Szczegóły, kliknij Kopiuj plik, a gdy pojawi się Kreator eksportu certyfikatów, kliknij Dalej, jak poniżej:

przejdź do szczegółów - skopiuj plik - następnie w kreatorze eksportu

Krok 8. Pozostaw kodowanie DER, kliknij dalej, wybierz Browse, umieść go w łatwo dostępnym folderze, takim jak Pulpit, i nazwij certyfikat localhost.cer, then click Save and then Finish.. Certyfikat powinien być widoczny na komputerze.

Krok 9. Otwórz chrome://settings/, wstawiając go w polu adresu URL. Kliknij poniżej, Advanced / Advanced Optionsa następnie przewiń w dół, aby znaleźć Manage Certificates.

wybierz zarządzanie certyfikatami

Krok 10. Przejdź do panelu Zaufane główne urzędy certyfikacji i kliknij importuj.

Przejdź do panelu Zaufane główne urzędy certyfikacji i kliknij importuj

Zaimportujemy localhost.cercertyfikat, który właśnie zakończyliśmy eksportować w kroku 8.

Krok 11. kliknij przeglądaj, znajdź localhost.cer, pozostaw wartości domyślne kliknij kilka razy dalej - dopóki nie pojawi się to ostrzeżenie, kliknij tak.

potwierdź wyjątek bezpieczeństwa

Krok 12. Zamknij wszystko i uruchom ponownie Chrome. Następnie jadąc do https://localhost:3000Ciebie powinieneś zobaczyć: pokocham zieleń

AIon
źródło
Cześć, kiedy kończę wszystkie kroki, które otwieram, https://localhost:3000i Chrome blokuje się podczas ładowania. Każdy może powiedzieć, co może być przyczyną?
co.zohar
@ co.zohar jakaś wiadomość w konsoli? Naciśnij crl+shift+ilub, F12aby otworzyć konsolę.
AI dnia
1
Jeśli robisz to dla adresu w sieci, odkryłem, że konfigurując certyfikat DNS na nazwę hosta, taką jak: DNS.1 = server.local Następnie na komputerze łączącym zaktualizuj plik HOSTS, aby wskazywał adres IP serwera na nazwę hosta, na przykład: 192.168.0.50 server.localTo będzie zezwól certyfikatowi i adresowi na dopasowanie i zweryfikuj certyfikat.
roskelld
@AIon konsola nic nie pokazuje. Strona wyświetla tylko: „Oczekiwanie na localhost ...”. Czy coś skonfigurowałeś w pliku hosts?
Zohar,
1
Znalazłem częściowo odpowiedź na moje własne pytanie: jeśli zmienisz CN i DNS.1 na przykład na coś takiego jak „local.com” i na każdym komputerze, który potrzebuje dostępu do serwera, zmień plik etc / hosts, aby wskazywał na lokalny .com na adres IP serwera, to działa.
TKoL
111

Najkrótsza droga. Przetestowano na MacOS, ale może działać podobnie w innych systemach operacyjnych.

Wygeneruj pem

> openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365

> openssl rsa -in keytmp.pem -out key.pem

Twój serwer ekspresowy

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
  res.send('WORKING!')
})

const httpsOptions = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
}
const server = https.createServer(httpsOptions, app).listen(port, () => {
  console.log('server running at ' + port)
})
  • Otwórz https://localhost:3000w Google Chrome, a zobaczysz, że nie jest to bezpieczne. Jeszcze!
  • W Narzędziach dla programistów> Bezpieczeństwo> Wyświetl certyfikat: Przeciągnij obraz na pulpit i kliknij go dwukrotnie.
  • Kliknij „Dodaj”
  • Znajdź go w Dostępie do pęku kluczy i kliknij go dwukrotnie
  • Rozwiń „Zaufaj” i zmień „Używając tego certyfikatu” na „Zawsze ufaj”.
  • Może zostać wyświetlony monit o uwierzytelnienie.
  • Uruchom ponownie serwer.
  • Odśwież przeglądarkę.
  • Cieszyć się! :)
Diego Mello
źródło
1
Oto kolejny link, jeśli chcesz to zrobić na komputerze Mac: certsimple.com/blog/localhost-ssl-fix .
Jan
Piękny! To zadziałało! Chciałbym dodać : Zainstaluj OpenSSL stąd: indy.fulgan.com/SSL/?C=M;O=A . Pobierz plik .cnf stąd: a następnie skonfiguruj go tutaj: gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/... i skonfiguruj openSSL stąd: stackoverflow.com/questions/7360602/…
Jose A
2
Chciałbym dodać, że w przypadku przeglądarki Chrome 58+ pojawi się błąd „Brak alternatywnej nazwy podmiotu”. stackoverflow.com/a/42917227/1057052 . Sprawdź odpowiedzi poniżej, aby uzyskać dodatkową pomoc: stackoverflow.com/a/43666288/1057052 , stackoverflow.com/a/44398368/1057052
Jose A
14
Drag image to your desktop and double click it-> nie mogę niczego przeciągnąć na pulpit, nie można tego przeciągnąć .. O czym imagedokładnie mówisz?
AI dnia
7
Aby rozwiązać problem „Brak alternatywnej nazwy podmiotu” w Chrome, możesz to zrobić openssl req -newkey rsa:2048 -x509 -nodes -keyout keytmp.pem -new -out cert.pem -subj /CN=localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:localhost')) -sha256 -days 3650zamiast pierwszej sugerowanej linii. A także ten zada mniej pytań ...
Michael Litvin,
78

Możesz spróbować openSSL do generowania certyfikatów. Spojrzeć na to .

Będziesz potrzebował pliku .key i .crt, aby dodać HTTPS do serwera ekspresowego JS węzła. Po wygenerowaniu tego kodu użyj tego kodu, aby dodać HTTPS do serwera.

var https = require('https');
var fs = require('fs');
var express = require('express');

var options = {
    key: fs.readFileSync('/etc/apache2/ssl/server.key'),
    cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
    requestCert: false,
    rejectUnauthorized: false
};


var app = express();

var server = https.createServer(options, app).listen(3000, function(){
    console.log("server started at port 3000");
});

Działa to dobrze na moim komputerze lokalnym, a także na serwerze, na którym to wdrożyłem. Ten, który mam na serwerze, został kupiony od goDaddy, ale localhost miał certyfikat z podpisem własnym.

Jednak każda przeglądarka wyświetlała błąd informujący, że połączenie nie jest zaufane, czy chcesz kontynuować. Po kliknięciu Kontynuuj wszystko działało dobrze.

Jeśli ktoś kiedykolwiek obejrzał ten błąd z certyfikatem z podpisem własnym, proszę oświecić.

Mars Robertson
źródło
9
Twój certyfikat nadal nie jest zaufany, więc masz ten sam problem, który opisuję. Potrzebuję zaufania do prawidłowego testowania / debugowania usługi sieciowej.
JasonS
1
Czy chcesz, aby ten certyfikat był zaufany tylko na komputerze lokalnym, a nie w sieci?
1
łącze u góry odpowiedzi zaleca 1024-bitowe szyfrowanie 3DES, które jest zdecydowanie przestarzałe. Lepiej użyć openssl genrsa -out key.pem 2048dla lepszego klucza.
steampowered
3
Twój certyfikat nadal nie jest zaufany.
Diego Mello
2
powyższy kod ekspresowy działa, wykorzystując github.com/FiloSottile/mkcert (zamiast openSSL) do utworzenia lokalnego urzędu certyfikacji / zaufanego certyfikatu. Zielone paski na całej długości.
som
11

Jak wygenerować certyfikat SSL dla hosta lokalnego: link

openssl genrsa -des3 -out server.key 1024

w tym miejscu należy wprowadzić hasło , które należy wpisać ponownie w kolejnych krokach

openssl req -new -key server.key -out server.csr

gdy zostaniesz zapytany o "Common Name", wpisz: localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
fuma
źródło
1
To jest rozwiązanie, które przeszukiwałem internet przez ostatnie 2 godziny. Dla każdego w Ubuntu przenieś cp server.crt /usr/local/share/ca-certificates/.i uruchom. sudo update-ca-certificatesNastępnie żądania https localhost działają pod NodeJS 8+. Id również wzrosną1024 to 2048
Salyangoz
6

Oto, co działa dla mnie

w oknach

1) Dodaj to do pliku% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net (powoduje, że przeglądarka ma problemy z 'localhost' (w przypadku skryptów między )

Systemy Windows Vista i Windows 7 Vista i Windows 7 korzystają z funkcji kontroli konta użytkownika (UAC), więc Notatnik musi być uruchomiony jako administrator.

  1. Kliknij Start -> Wszystkie programy -> Akcesoria

  2. Kliknij prawym przyciskiem Notatnik i wybierz Uruchom jako administrator

  3. Kliknij Kontynuuj w oknie UAC „Windows potrzebuje Twojej zgody”.

  4. Po otwarciu Notatnika Kliknij Plik -> Otwórz

  5. W polu nazwy pliku wpisz C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. Kliknij Otwórz

  7. Dodaj to do pliku% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net

  8. Zapisać

  9. Zamknij i uruchom ponownie przeglądarki

W systemie Mac lub Linux:

  1. Otwórz / etc / hosts za suzgodą
  2. Dodaj 127.0.0.1 localdev.YOURSITE.net
  3. Zapisz to

Podczas programowania używasz localdev.YOURSITE.net zamiast localhost, więc jeśli używasz konfiguracji uruchom / debug w swoim IDE, pamiętaj, aby go zaktualizować.

Użyj ".YOURSITE.net" jako Cookiedomain (z kropką na początku) podczas tworzenia pliku cookie, to powinno działać ze wszystkimi subdomenami.

2) utwórz certyfikat przy użyciu tego pliku localdev.url

WSKAZÓWKA: Jeśli masz problemy z generowaniem certyfikatów w systemie Windows, użyj zamiast tego maszyny VirtualBox lub Vmware.

3) zaimportuj certyfikat zgodnie z opisem na http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

TroyWorks
źródło
Cześć Troy, dzięki za udostępnienie tego. Ktoś inny będzie musiał skomentować, czy to działa, czy nie. Moje obejście: w końcu dodałem dev.phantomjscloud.com do mojego pliku hosts, a następnie użyłem mojego certyfikatu produkcyjnego. Jest to przydatne tylko wtedy, gdy chcesz, aby twoje klucze produkcyjne były dostępne na twoim dev boxie, więc myślę, że twoje rozwiązanie może nadal być prawidłowe, jeśli ktoś inny może to zweryfikować
JasonS
To działa dla mnie i mojego zespołu, na wiele sposobów, zabezpieczając serwer lokalny do lokalnego, aby zabezpieczyć serwer lokalny do serwera produkcyjnego.
TroyWorks
W systemie Windows konsola git bash działa świetnie, używając poleceń openssl z tego miejsca . Wystarczy zainstalować certyfikat główny, a jeśli chcesz, możesz utworzyć wiele podpisanych przez niego certyfikatów specyficznych dla witryny.
Jason Goemaat
6

Mkcert z @FiloSottile sprawia, że ​​ten proces jest nieskończenie prostszy:

  1. Zainstaluj mkcert , są instrukcje dla macOS / Windows / Linux
  2. mkcert -install aby utworzyć lokalny ośrodek certyfikacji
  3. mkcert localhost 127.0.0.1 ::1 aby utworzyć zaufany certyfikat dla hosta lokalnego w bieżącym katalogu
  4. Używasz węzła (który nie korzysta z głównego magazynu systemu), więc musisz jawnie określić CA w zmiennej środowiskowej, np .:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. Na koniec uruchom swój serwer ekspresowy, korzystając z konfiguracji opisanej w różnych innych odpowiedziach (np. Poniżej)
  6. Bum. Lokalny gospodarz pływa na zielono.

Podstawowa konfiguracja węzła:

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

const app = express();    
const server = https.createServer({
    key: fs.readFileSync('/XXX/localhost+2-key.pem'), // where's me key?
    cert: fs.readFileSync('/XXX/localhost+2.pem'), // where's me cert?
    requestCert: false,
    rejectUnauthorized: false,
}, app).listen(10443); // get creative
som
źródło
Działa świetnie! Dzięki takiemu podejściu nie musimy rejestrować naszego certyfikatu z podpisem własnym jako zaufanego urzędu certyfikacji CA w magazynie certyfikatów Chrome / Windows. Jak wspomniano w innych odpowiedziach.
zaheer
4

Jeśli korzystasz z systemu OSX / Chrome, możesz dodać samopodpisany certyfikat SSL do pęku kluczy systemu, jak wyjaśniono tutaj: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and certyfikaty ssl z podpisem własnym

To proces ręczny, ale w końcu działał. Po prostu upewnij się, że nazwa zwykła (CN) jest ustawiona na „localhost” (bez portu) i po dodaniu certyfikatu upewnij się, że wszystkie opcje zaufania w certyfikacie są ustawione na „Zawsze ufaj”. Upewnij się również, że dodajesz go do pęku kluczy „System”, a nie do pęku kluczy „logowania”.

Vijay Rudraraju
źródło
Wspomina IE, co oznacza, że ​​używa Windowsa.
2-bitowe
3

Jeśli używasz węzła, dlaczego nie wygenerować ich za pomocą węzła? Ten moduł wydaje się być w pełni funkcjonalny:

Pamiętaj, że nie generowałbym w locie. Generuj za pomocą jakiegoś skryptu kompilacji, aby mieć spójny certyfikat i klucz. W przeciwnym razie za każdym razem będziesz musiał autoryzować nowo wygenerowany certyfikat z podpisem własnym.

BT
źródło
3

Niektóre z opublikowanych odpowiedzi zawierają elementy, które były dla mnie bardzo przydatne w rozwiązaniu tego problemu. Jednak interesowała mnie również minimalna liczba kroków i najlepiej unikanie OpenSSL (w systemie Windows 10).

Tak więc jednym z krytycznych fragmentów odpowiedzi (kredyt: @ TroyWorks ) jest to, że musisz edytować plik HOSTS, aby utworzyć fikcyjny serwer i zmapować go na 127.0.0.1. Zakłada się, że zamierzasz zajmować się rozwojem lokalnym.

W moim przypadku używałem certyfikatu SS do zabezpieczenia gniazda sieciowego w NodeJS, do którego podłączałem się programowo (w przeciwieństwie do przeglądarki). Dlatego dla mnie krytyczne było, aby certyfikat został zaakceptowany bez ostrzeżeń i błędów, a krytycznym elementem było uzyskanie certyfikatu utworzonego z odpowiednim CN (i oczywiście zaakceptowanie certyfikatu w Zaufanych Władzach, jak opisano w innym miejscu w odpowiedziach) . Użycie usług IIS do utworzenia certyfikatu z podpisem własnym nie spowoduje utworzenia prawidłowego CN, więc odkryłem następujące proste polecenie przy użyciu programu PowerShell:

New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:\LocalMachine\My"

Należy to uruchomić w konsoli administracyjnej PS, ale po prostu działa i umieszcza certyfikat w sekcji „Osobiste” magazynu certyfikatów LocalMachine. Możesz sprawdzić, czy został utworzony, wykonując:

ls cert:\LocalMachine\My 

Aby mu zaufać, po prostu skopiuj to i wklej do „Zaufanych głównych urzędów certyfikacji” za pomocą Menedżera certyfikatów (upewnij się, że patrzysz na certyfikaty komputera lokalnego, a nie na Bieżącego użytkownika!).

Jeśli powiążesz się z tym certyfikatem w usługach IIS, powinieneś być w stanie trafić na https://gandalf.dummy.dev/ i uzyskać bezpieczne połączenie bez żadnych ostrzeżeń.

Ostatni fragment, wykorzystujący to w NodeJS, jest opisany powyżej i w innych odpowiedziach SO, więc dodam tylko, że w systemie Windows łatwiej jest pracować z plikiem pfx, który łączy certyfikat i klucz prywatny. Możesz łatwo wyeksportować plik pfx z Menedżera certyfikatów, ale ma to wpływ na sposób użycia go w NodeJS. Podczas tworzenia wystąpienia serwera przy użyciu modułu „https” opcje, których użyjesz (zamiast „key” i „cert”) to „pfx” i „passphrase”, na przykład:

var https = require('https');
var options = { 
    pfx: fs.readFileSync('mypfxfile'), 
    passphrase: 'foo' 
};
var server = https.createServer(options);
tomo
źródło
2

W systemie Windows zaufałem certyfikatowi programistycznemu iis za pomocą MMC (start> uruchom> mmc), a następnie dodaję przystawkę certyfikatu, wybierając „komputer lokalny” i akceptując wartości domyślne. Po dodaniu tego przyciągania certyfikatu rozwiń drzewo certyfikatów komputera lokalnego, aby spojrzeć na Osobiste, wybierz certyfikat hosta lokalnego, kliknij prawym przyciskiem myszy> wszystkie zadania> eksportuj. zaakceptuj wszystkie ustawienia domyślne w kreatorze eksportu.

Po zapisaniu tego pliku rozwiń zaufane certyfikaty i zacznij importować certyfikat, który właśnie wyeksportowałeś. https://localhostjest teraz zaufany w Chrome i nie ma żadnych ostrzeżeń dotyczących bezpieczeństwa.

Skorzystałem z tego przewodnika w rozwiązaniu nr 2 z bloga MSDN, op również udostępnił link w swoim pytaniu, aby również użyć MMC, ale to zadziałało dla mnie. rezolucja nr 2

grzyby
źródło
2

Iść do: chrome://flags/

Włącz: Zezwalaj na nieprawidłowe certyfikaty dla zasobów ładowanych z hosta lokalnego.

Nie masz zielonego zabezpieczenia, ale zawsze możesz korzystać z https: // localhost w chrome.

Alphapage
źródło
2

Jest w tym więcej aspektów.

Możesz osiągnąć TLS (niektórzy wciąż mówią, że SSL) za pomocą certyfikatu, samopodpisanego lub nie.

Aby mieć zielony pasek dla certyfikatu z podpisem własnym, musisz także zostać urzędem certyfikacji (CA). Tego aspektu brakuje w większości zasobów, które znalazłem podczas mojej podróży do osiągnięcia zielonego paska w mojej konfiguracji lokalnego rozwoju. Uzyskanie statusu CA jest tak proste, jak utworzenie certyfikatu.

Ten zasób obejmuje tworzenie zarówno certyfikatu CA, jak i certyfikatu serwera, i spowodował, że moja konfiguracja wyświetlała zielony pasek na hoście lokalnym Chrome, Firefox i Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Uwaga: w przeglądarce Chrome musisz dodać certyfikat CA do zaufanych organów.

Jos
źródło
0

Jeśli chcesz pójść o krok dalej niż szczegółowe kroki @ alon, a także utworzyć własny podpisany certyfikat:

https.createServer({
  key: fs.readFileSync(NODE_SSL_KEY),
  cert: fs.readFileSync(NODE_SSL_CERT),
  ca: fs.readFileSync(NODE_SSL_CA),
}, app).listen(PORT, () => {});

package.json

"setup:https": "openssl genrsa -out src/server/ssl/localhost.key 2048
&& openssl req -new -x509 -key src/server/ssl/localhost.key -out src/server/ssl/localhost.crt -config src/server/ssl/localhost.cnf
&& openssl req -new -out src/server/ssl/localhost.csr -config src/server/ssl/localhost.cnf
&& openssl x509 -req -in src/server/ssl/localhost.csr -CA src/server/ssl/localhost.crt -CAkey src/server/ssl/localhost.key -CAcreateserial -out src/server/ssl/ca.crt",

Korzystanie z localhost.cnf zgodnie z opisem:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = UK
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost
mummybot
źródło