creare un certificato SSL autofirmato affidabile per localhost (da utilizzare con Express / Node)


130

Tentando di seguire varie istruzioni sulla creazione di un certificato autofirmato da utilizzare con localhost, la maggior parte delle istruzioni sembra essere per IIS, ma sto cercando di utilizzare Nodejs / Express. Nessuno di loro funziona correttamente perché mentre il certificato viene installato, non è attendibile. ecco cosa ho provato che fallisce:

Qualcuno può offrire un flusso di lavoro in grado di farlo? Posso ottenere un certificato installato, ma non riesco a ottenere l'affidabilità del certificato in Chrome (v32) o IE (v10).

EDIT: nei commenti è stato suggerito che il problema non è un certificato root attendibile. Ho installato il certificato tramite IE ma non è ancora attendibile.


Nessuno dei certificati autofirmati può essere reso attendibile per i browser web. Non sono firmati da autorità di firma affidabili.

1
non è vero: puoi installare un certificato radice per ottenere il tuo certificato autofirmato attendibile. tuttavia non riesco a farlo correttamente. Ho letto che puoi installare la catena di certificati in IE (non in chrome), quindi l'ho provato ma non viene ancora riconosciuto. Non so se è perché localhost è speciale o se il certificato autofirmato non è corretto.
JasonS

3
Non ho mai ricevuto un certificato autofirmato funzionante con browser come Chrome. Ecco la mia soluzione alternativa: ho creato una voce DNS per local.MYDOMAIN.com che punta a 127.0.0.1 (localhost) e quindi ho utilizzato il mio certificato di produzione. Questo ha l'ulteriore vantaggio di assicurarsi che non ci siano problemi con la catena del certificato di produzione, ecc.
JasonS

Risposte:


86

Le risposte di cui sopra erano parziali. Ho passato così tanto tempo a farlo funzionare, è folle. Nota per me stesso futuro, ecco cosa devi fare:

Sto lavorando su Windows 10, con Chrome 65. Firefox si sta comportando bene: basta confermare localhost come eccezione di sicurezza e funzionerà. Chrome non:

Passaggio 1. Nel tuo backend, crea una cartella chiamata security. ci lavoreremo al suo interno.

Passaggio 2: crea un file di configurazione della richiesta denominato req.cnfcon il seguente contenuto (il merito va a: @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

Una spiegazione di questi campi è qui .

Passaggio 3: accedere alla cartella della sicurezza nel terminale e digitare il seguente comando:

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

Passaggio 4. quindi fuori dalla securitycartella, nella tua app express fai qualcosa del genere: (il merito va a @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)
    })

Passaggio 5. avviare il server, node server.jse andare su https: // localhost: 3000 .

A questo punto abbiamo la configurazione del server. Ma il browser dovrebbe mostrare un messaggio di avviso.

Dobbiamo registrare il nostro certificato autofirmato, come autorità di certificazione attendibile CA, nell'archivio certificati di Chrome / Windows. (Chrome lo salva anche in Windows,)

Passaggio 6. apri Dev Tools in Chrome, vai al pannello Sicurezza, quindi fai clic su Visualizza certificato. inserisci qui la descrizione dell'immagine

Passaggio 7. Vai al pannello Dettagli, fai clic su Copia file, quindi quando viene visualizzata la procedura guidata di esportazione del certificato, fai clic su Avanti come di seguito:

vai ai dettagli - copia file - avanti nella procedura guidata di esportazione

Passaggio 8. Esci dalla codifica DER, fai clic su Avanti, scegli Browse, inseriscilo in una cartella di facile accesso come Desktop e assegna un nome al certificatolocalhost.cer, then click Save and then Finish. . Dovresti essere in grado di vedere il tuo certificato sul desktop.

Passaggio 9. Aprire chrome://settings/inserendolo nella casella dell'URL. In basso, fai clic su Advanced / Advanced Options, quindi scorri verso il basso per trovare Manage Certificates.

scegli gestisci certificati

Passaggio 10. Vai al pannello Autorità di certificazione radice attendibili e fai clic su Importa.

Vai al pannello Autorità di certificazione radice attendibili e fai clic su Importa

Importeremo il localhost.cercertificato che abbiamo appena esportato al passaggio 8.

Passaggio 11. Fare clic su Sfoglia, trovare localhost.cer, lasciare i valori predefiniti fare clic su Avanti un sacco di volte - fino a quando non viene visualizzato questo avviso, fare clic su Sì.

confermare l'eccezione di sicurezza

Passaggio 12. Chiudi tutto e riavvia Chrome. Quindi, quando vai da https://localhost:3000te dovresti vedere: devo amare il verde


Ciao, quando finisco tutti i passaggi apro https://localhost:3000e Chrome si blocca sul caricamento. Qualcuno può dire quale potrebbe essere il motivo?
co.zohar

@ co.zohar qualche messaggio nella console? Premere crl+shift+io F12per aprire la console.
AIon

1
Se stai facendo questo per un indirizzo su una rete, ho scoperto che la configurazione del DNS del certificato su un nome host come: DNS.1 = server.local Quindi sulla macchina di connessione aggiorna il file HOSTS per puntare l'indirizzo IP del server al nome host, ad esempio: 192.168.0.50 server.localQuesto lo farà consentire la corrispondenza tra il certificato e l'indirizzo e convalidare il certificato.
roskelld

@AIon la console non mostra nulla. La pagina mostra solo: "Waiting for localhost ...". Hai configurato qualcosa nel file hosts?
co.zohar

1
Ho trovato una semi-risposta alla mia stessa domanda: se cambi CN e DNS.1 in qualcosa come "local.com", ad esempio, e in ogni computer che necessita di accesso al server, modifica il file etc / hosts in modo che punti local .com all'ip del server, funziona.
TKoL

111

La via più breve. Testato su MacOS, ma potrebbe funzionare in modo simile su altri sistemi operativi.

Genera pem

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

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

Il tuo server espresso

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)
})
  • Apri https://localhost:3000in Google Chrome e vedrai che non è sicuro. Ancora!
  • In Strumenti per sviluppatori> Sicurezza> Visualizza certificato: trascina l'immagine sul desktop e fai doppio clic su di essa.
  • Fare clic su "Aggiungi"
  • Trovalo in Accesso Portachiavi e fai doppio clic su di esso
  • Espandi "Attendibile" e modifica "Quando si utilizza questo certificato" in "Attendibile sempre".
  • È possibile che venga richiesto di eseguire l'autenticazione.
  • Riavvia il tuo server.
  • Aggiorna il tuo browser.
  • Godere! :)

1
Ecco un altro collegamento se vuoi farlo su Mac: certsimple.com/blog/localhost-ssl-fix .
John

Bellissimo! Questo ha funzionato! Vorrei aggiungere: Installa OpenSSL da qui: indy.fulgan.com/SSL/?C=M;O=A . Ottenere il file .cnf da qui: e poi, configurare da qui: gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/... e configurare openSSL da qui: stackoverflow.com/questions/7360602/...
Jose A

2
Vorrei aggiungere che per Chrome 58+ riceverai un errore "Nome alternativo soggetto mancante". stackoverflow.com/a/42917227/1057052 . Controlla le risposte di seguito per ulteriore assistenza: stackoverflow.com/a/43666288/1057052 , stackoverflow.com/a/44398368/1057052
Jose A

14
Drag image to your desktop and double click it-> non riesco a trascinare nulla sul desktop, non è trascinabile .. Di cosa imagestai parlando o esattamente?
AIon

7
Per superare "Nome alternativo soggetto mancante" in Chrome, potresti fare al 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 3650posto della prima riga che hai suggerito. E anche questo farà meno domande nel processo ...
Michael Litvin

78

Puoi provare openSSL per generare certificati. Dai un'occhiata a questo .

Avrai bisogno di un file .key e .crt per aggiungere HTTPS al server JS Express del nodo. Una volta generato, utilizza questo codice per aggiungere HTTPS al server.

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");
});

Funziona bene sulla mia macchina locale e sul server in cui l'ho distribuito. Quello che ho nel server è stato acquistato da goDaddy ma localhost aveva un certificato autofirmato.

Tuttavia, ogni browser ha generato un errore dicendo che la connessione non è attendibile, vuoi continuare. Dopo aver fatto clic su Continua, ha funzionato bene.

Se qualcuno ha mai aggirato questo errore con un certificato autofirmato, si prega di illuminare.


9
Il tuo certificato non è ancora attendibile, quindi hai lo stesso problema che sto descrivendo. Ho bisogno che sia attendibile per testare / eseguire il debug di un servizio web correttamente.
JasonS

1
Quindi vuoi che questo certificato sia considerato attendibile solo nella tua macchina locale e non nella rete?

1
il collegamento nella parte superiore della risposta raccomanda la crittografia 3DES a 1024 bit, che è decisamente obsoleta. Meglio usare openssl genrsa -out key.pem 2048per una chiave migliore.
vapore il

3
Il tuo certificato non è ancora attendibile.
Diego Mello

2
il codice espresso sopra funziona, utilizzando github.com/FiloSottile/mkcert (invece di openSSL) per creare un CA / certificato attendibile locale. Barre verdi fino in fondo.
som

11

Come generare un certificato SSL per localhost: link

openssl genrsa -des3 -out server.key 1024

è necessario inserire una password qui che è necessario digitare nuovamente nei seguenti passaggi

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

quando viene chiesto "Nome comune", digitare: localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt

1
Questa è la soluzione in cui ho setacciato Internet nelle ultime 2 ore. Per chiunque in Ubuntu, sposta cp server.crt /usr/local/share/ca-certificates/.ed esegui Le sudo update-ca-certificatesrichieste https di localhost funzionano con NodeJS 8+. Id anche aumentare1024 to 2048
Salyangoz

6

Ecco cosa funziona per me

Su Windows

1) Aggiungilo al tuo file% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net (perché il browser ha problemi con 'localhost' (per script cross origin)

Windows Vista e Windows 7 Vista e Windows 7 utilizzano Controllo dell'account utente (UAC), quindi Blocco note deve essere eseguito come amministratore.

  1. Fare clic su Start -> Tutti i programmi -> Accessori

  2. Fare clic con il pulsante destro del mouse su Blocco note e selezionare Esegui come amministratore

  3. Fare clic su Continua nella finestra UAC "Windows richiede la tua autorizzazione".

  4. Quando si apre Blocco note, fare clic su File -> Apri

  5. Nel campo del nome del file digitare C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. Fare clic su Apri

  7. Aggiungilo al tuo file% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net

  8. Salva

  9. Chiudi e riavvia i browser

Su Mac o Linux:

  1. Apri / etc / hosts con il supermesso
  2. Inserisci 127.0.0.1 localdev.YOURSITE.net
  3. Salvarla

Durante lo sviluppo usi localdev.YOURSITE.net invece di localhost, quindi se stai usando configurazioni di esecuzione / debug nel tuo ide assicurati di aggiornarlo.

Usa ".YOURSITE.net" come cookiedomain (con un punto all'inizio) durante la creazione del cookiem, quindi dovrebbe funzionare con tutti i sottodomini.

2) crea il certificato usando quel localdev.url

SUGGERIMENTO: se hai problemi a generare certificati su Windows, usa invece una macchina VirtualBox o Vmware.

3) importa il certificato come indicato su http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/


Ciao Troy, grazie per aver condiviso questo. Qualcun altro dovrà commentare se funziona o meno. La mia soluzione alternativa: ho finito per aggiungere dev.phantomjscloud.com al mio file hosts e quindi utilizzare il mio certificato di produzione. Ciò è utile solo se desideri che le tue chiavi di produzione siano disponibili sulla tua scatola di sviluppo, quindi penso che la tua soluzione potrebbe essere ancora valida, se qualcun altro può verificare
JasonS

Funziona per me e il mio team, in una combinazione di modi, dal locale al server locale al sicuro dal locale al server di produzione.
TroyWorks

Per Windows, la console git bash funziona alla grande usando i comandi openssl da qui . Devi solo installare il certificato radice e puoi creare più certificati specifici del sito firmati da esso, se lo desideri.
Jason Goemaat

6

Mkcert di @FiloSottile rende questo processo infinitamente più semplice:

  1. Installa mkcert , ci sono istruzioni per macOS / Windows / Linux
  2. mkcert -install per creare una CA locale
  3. mkcert localhost 127.0.0.1 ::1 per creare un certificato attendibile per localhost nella directory corrente
  4. Stai utilizzando node (che non utilizza l'archivio principale di sistema), quindi devi specificare esplicitamente la CA in una variabile di ambiente, ad esempio:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. Infine, esegui il tuo server espresso utilizzando la configurazione descritta in varie altre risposte (ad esempio sotto)
  6. boom. localhost sta nuotando nel verde.

Configurazione del nodo di base:

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

Funziona alla grande! Con questo approccio non è necessario registrare il nostro certificato autofirmato, come autorità di certificazione attendibile CA, nell'archivio certificati di Chrome / Windows. Come accennato in altre risposte.
zaheer

4

Se utilizzi OSX / Chrome puoi aggiungere il certificato SSL autofirmato al tuo portachiavi di sistema come spiegato qui: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and -self--SSL-certificati firmati

È un processo manuale, ma finalmente funziona. Assicurati solo che il nome comune (CN) sia impostato su "localhost" (senza la porta) e dopo aver aggiunto il certificato assicurati che tutte le opzioni di affidabilità sul certificato siano impostate su "Considera sempre affidabile". Assicurati inoltre di aggiungerlo al portachiavi "Sistema" e non al portachiavi "login".


Cita IE, il che significa che sta usando Windows.
2 bit

3

Se stai usando node, perché non generarli con node? Questo modulo sembra essere abbastanza completo:

Nota che non genererei al volo. Genera con una sorta di script di build in modo da avere un certificato e una chiave coerenti. Altrimenti dovrai autorizzare ogni volta il certificato autofirmato appena generato.


3

Alcune delle risposte postate contengono pezzi che mi sono stati molto utili per superare anche questo problema. Tuttavia, mi interessava anche il numero minimo di passaggi e, idealmente, evitare OpenSSL (su Windows 10).

Quindi, un elemento critico delle risposte (credito: @ TroyWorks ) è che devi modificare il tuo file HOSTS per creare un server fittizio e mapparlo a 127.0.0.1. Questo presume che farai sviluppo locale.

Nel mio caso, stavo usando il certificato SS per proteggere un websocket in NodeJS e quel socket era connesso a livello di programmazione (invece che tramite browser). Quindi per me, era fondamentale che il certificato fosse accettato senza avvisi o errori, e il pezzo fondamentale era ottenere il certificato creato con un CN appropriato (e ovviamente accettare il certificato nelle autorità attendibili, come descritto altrove nelle risposte) . L'utilizzo di IIS per creare un certificato autofirmato non creerà il CN corretto, quindi ho scoperto il seguente semplice comando utilizzando Powershell:

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

Deve essere eseguito nella console di amministrazione di PS, ma funziona semplicemente e inserisce il certificato nella sezione "Personale" dell'archivio certificati di LocalMachine. Puoi verificare che sia stato creato eseguendo:

ls cert:\LocalMachine\My 

Per fidarti, copia semplicemente questo e incollalo in "Autorità di certificazione radice attendibili" utilizzando Gestione certificati (assicurandoti di guardare i certificati del computer locale, non l'utente corrente!).

Se ti leghi a questo certificato in IIS, dovresti essere in grado di premere https://gandalf.dummy.dev/ e ottenere una connessione sicura senza avvisi.

Il pezzo finale, usando questo in NodeJS, è descritto sopra e in altre risposte SO, quindi aggiungerò solo che su Windows, è più facile lavorare con un file pfx che combina il certificato e la chiave privata. Puoi esportare facilmente un pfx dal gestore certificati, ma influisce sul modo in cui lo usi in NodeJS. Quando si crea un'istanza di un Server utilizzando il modulo "https", le opzioni che usereste (invece di "chiave" e "cert") sarebbero "pfx" e "passphrase", come in:

var https = require('https');
var options = { 
    pfx: fs.readFileSync('mypfxfile'), 
    passphrase: 'foo' 
};
var server = https.createServer(options);

2

su Windows ho reso attendibile il certificato di sviluppo iis utilizzando MMC (start> run> mmc), quindi aggiungo lo snap-in del certificato, scegliendo "computer locale" e accettando i valori di default. Una volta aggiunto lo snapip del certificato, espandere l'albero dei certificati del computer locale per cercare in Personale, selezionare il certificato dell'host locale, fare clic con il tasto destro> tutte le attività> esporta. accetta tutti i valori predefiniti nella procedura guidata di esportazione.

Una volta salvato il file, espandi i certificati attendibili e inizia a importare il certificato appena esportato. https://localhostora è considerato attendibile in Chrome senza avvisi di sicurezza.

Ho usato questa risoluzione della guida n. 2 dal blog MSDN, l'opera ha anche condiviso un collegamento nella sua domanda a riguardo che dovrebbe anche usare MMC ma questo ha funzionato per me. risoluzione # 2


2

Vai a: chrome://flags/

Abilita: Consenti certificati non validi per risorse caricate da localhost.

Non hai la sicurezza verde, ma sei sempre autorizzato per https: // localhost in chrome.


2

Ci sono più aspetti in questo.

Puoi ottenere TLS (alcuni continuano a dire SSL) con un certificato, autofirmato o meno.

Per avere una barra verde per un certificato autofirmato, devi anche diventare l'autorità di certificazione (CA). Questo aspetto manca nella maggior parte delle risorse che ho trovato nel mio viaggio per ottenere la barra verde nella mia configurazione di sviluppo locale. Diventare una CA è facile come creare un certificato.

Questa risorsa copre la creazione sia del certificato CA che di un certificato del server e ha portato la mia configurazione a mostrare una barra verde su localhost Chrome, Firefox e Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Nota: in Chrome devi aggiungere il certificato CA alle tue autorità di fiducia.


0

Se è necessario fare un ulteriore passo avanti rispetto ai passaggi dettagliati di @alon e creare anche una ca autofirmata:

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",

Utilizzando localhost.cnf come descritto:

[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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.