it-swarm.com.de

erstellen Sie ein vertrauenswürdiges selbstsigniertes SSL-Zertifikat für localhost (zur Verwendung mit Express/Node).

Beim Versuch, verschiedene Anweisungen zum Erstellen eines selbstsignierten Zertifikats für localhost zu befolgen, scheinen die meisten Anweisungen für IIS zu sein, aber ich versuche, Nodejs/Express zu verwenden. Keiner von ihnen funktioniert ordnungsgemäß, da das Zertifikat zwar installiert wird, jedoch nicht vertrauenswürdig ist. Folgendes habe ich versucht, das scheitert:

Kann jemand einen Workflow anbieten, der dies kann? Ich kann ein Zertifikat installieren, aber Ich kann das Zertifikat nicht in Chrome (v32) oder IE (V10) als vertrauenswürdig erachten. 

BEARBEITEN: In Kommentaren wurde vorgeschlagen, dass das Problem kein vertrauenswürdiges Zertifizierungsstamm ist. Ich habe das Zertifikat über IE installiert, aber es wird immer noch nicht vertraut. 

97
JasonS

Kürzester Weg. Wurde unter MacOS getestet, funktioniert aber möglicherweise auf anderen Betriebssystemen.

Pem generieren

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

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

Ihr Express-Server 

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)
})
  • Öffnen Sie https://localhost:3000 in Google Chrome und Sie werden feststellen, dass es nicht sicher ist. Noch!
  • In Developer Tools> Sicherheit> Zertifikat anzeigen: Ziehen Sie das Bild auf Ihren Desktop und doppelklicken Sie darauf.
  • Klicken Sie auf "Hinzufügen".
  • Finden Sie es in Keychain Access und doppelklicken Sie darauf
  • Erweitern Sie "Vertrauen" und ändern Sie "Bei Verwendung dieses Zertifikats" in "Immer vertrauen".
  • Möglicherweise werden Sie zur Authentifizierung aufgefordert.
  • Starten Sie Ihren Server neu.
  • Aktualisieren Sie Ihren Browser.
  • Genießen! :)
88
Diego Mello

Sie können es mit openSSL versuchen, Zertifikate zu generieren . Schauen Sie sich this an.

Sie benötigen eine .key- und .crt-Datei, um dem Knoten JS Express-Server HTTPS hinzuzufügen. Wenn Sie dies generiert haben, verwenden Sie diesen Code, um dem Server HTTPS hinzuzufügen.

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

Dies funktioniert gut auf meinem lokalen Rechner und auf dem Server, auf dem ich dies bereitgestellt habe. Der Server, den ich auf dem Server habe, wurde von goDaddy gekauft, aber localhost hatte ein selbstsigniertes Zertifikat.

Jeder Browser hat jedoch eine Fehlermeldung ausgegeben, die besagt, dass die Verbindung nicht vertrauenswürdig ist. Möchten Sie fortfahren? Nachdem ich auf Weiter geklickt habe, hat es gut funktioniert. 

Wenn jemand diesen Fehler jemals mit einem selbstsignierten Zertifikat umgangen hat, informieren Sie sich bitte.

76
user1741851

Die obigen Antworten waren unvollständig. Ich habe so viel Zeit damit verbracht, das zu schaffen, es ist verrückt. Beachten Sie für mein zukünftiges Ich, was Sie tun müssen: 

Ich arbeite an Windows 10 mit Chrome 65. Firefox verhält sich gut - bestätigen Sie einfach localhost als Sicherheitsausnahme und es wird funktionieren. Chrome tut nicht:

Schritt 1. Erstellen Sie in Ihrem Backend einen Ordner mit dem Namen security. wir werden drin arbeiten.

Schritt 2. Erstellen Sie eine Anforderungskonfigurationsdatei mit dem Namen req.cnf mit folgendem Inhalt (Gutschrift geht an: @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

Eine Erklärung dieser Felder ist hier .

Schritt 3. navigieren Sie zum Sicherheitsordner im Terminal und geben Sie den folgenden Befehl ein:

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

Schritt 4. dann außerhalb von security Ordner, mache in deiner Express-App so etwas: (Gutschrift geht an @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)
    })

Schritt 5. Starten Sie den Server node server.js und gehen Sie zu https: // localhost: 3000 .

Zu diesem Zeitpunkt haben wir den Server eingerichtet. Der Browser sollte jedoch eine Warnmeldung anzeigen. 

Wir müssen unser selbstsigniertes Zertifikat als zertifizierte CA-Zertifizierungsstelle im Chrome/Windows-Zertifikatsspeicher registrieren. (Chrom speichert dies auch in Windows,)

Schritt 6. Öffnen Sie die Dev Tools in Chrome, gehen Sie zum Bereich Sicherheit und klicken Sie auf Zertifikat anzeigen  enter image description here

Schritt 7. Gehen Sie zum Detailbereich, klicken Sie auf Datei kopieren. Wenn der Zertifikatexport Wizard angezeigt wird, klicken Sie wie folgt auf Weiter: 

 go to details - copy file - next on export wizard

Schritt 8. Die DER-Kodierung verlassen, auf Weiter klicken, Browse wählen, in einem einfach zuordnenden Ordner wie Desktop ablegen und das Zertifikat localhost.cer, then click Save and then Finish. nennen. Sie sollten Ihr Zertifikat auf dem Desktop anzeigen können.

Schritt 9. Öffnen Sie chrome://settings/, indem Sie ihn in das URL-Feld einfügen. Klicken Sie unten auf Advanced / Advanced Options und scrollen Sie nach unten, um Manage Certificates zu suchen.

 choose manage certificates

Schritt 10. Wechseln Sie zum Bereich Vertrauenswürdige Stammzertifizierungsstellen, und klicken Sie auf Importieren.

 Go to Trusted Root Certification Authorities panel, and click import

Wir importieren das localhost.cer-Zertifikat, das wir gerade in Schritt 8 exportiert haben.

Schritt 11. Klicken Sie auf Durchsuchen, suchen Sie den localhost.cer, lassen Sie die Standardwerte ein paar Mal klicken, bis diese Warnung angezeigt wird, klicken Sie auf Ja.

 confirm security exception

Schritt 12. Schließen Sie alles und starten Sie Chrome neu. Wenn Sie dann zu https://localhost:3000 gehen, sollten Sie Folgendes sehen:  gotta love the green

29
AIon

So erstellen Sie ein SSL-Zertifikat für localhost: link

openssl genrsa -des3 -out server.key 1024

sie müssen hier ein password eingeben, das Sie in den folgenden Schritten erneut eingeben müssen 

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

wenn Sie nach "Common Name" gefragt werden, geben Sie Folgendes ein: localhost

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

Hier ist was für mich arbeitet

an den Fenstern

1) Fügen Sie dies zu Ihrem% WINDIR%\System32\drivers\etc\hosts -Datei hinzu: 127.0.0.1 localdev.YOURSITE.net (Ursache, dass der Browser Probleme mit 'localhost' hat (für das Origin-Skripting))

Windows Vista und Windows 7 Vista und Windows 7 verwenden die Benutzerkontensteuerung (User Account Control, UAC). Notepad muss daher als Administrator ausgeführt werden.

  1. Klicken Sie auf Start -> Alle Programme -> Zubehör

  2. Klicken Sie mit der rechten Maustaste auf Editor und wählen Sie Als Administrator ausführen aus

  3. Klicken Sie im UAC-Fenster "Windows benötigt Ihre Berechtigung" auf Weiter.

  4. Wenn der Editor geöffnet wird, klicken Sie auf Datei -> Öffnen

  5. Geben Sie im Feld Dateiname Folgendes ein: C:\Windows\System32\Drivers\etc\hosts

  6. Klicken Sie auf Öffnen

  7. Fügen Sie dies der Datei% WINDIR%\System32\drivers\etc\hosts hinzu: 127.0.0.1 localdev.YOURSITE.net

  8. Sparen

  9. Schließen Sie die Browser und starten Sie sie erneut

Auf Mac oder Linux:

  1. Öffnen Sie/etc/hosts mit der Berechtigung su
  2. 127.0.0.1 localdev.YOURSITE.net hinzufügen
  3. Speichern Sie es

Bei der Entwicklung verwenden Sie localdev.YOURSITE.net anstelle von localhost. Wenn Sie also run/debug-Konfigurationen in Ihrem System verwenden, müssen Sie diese unbedingt aktualisieren.

Verwenden Sie ".YOURSITE.net" als cookiedomain (mit einem Punkt am Anfang), wenn Sie das Cookiem erstellen, dann sollte es mit allen Subdomains funktionieren.

2) Erstellen Sie das Zertifikat mit dieser Datei localdev.url.

TIPP: Wenn Probleme beim Generieren von Zertifikaten unter Windows auftreten, verwenden Sie stattdessen einen VirtualBox- oder VMware-Computer. 

3) Importieren Sie das Zertifikat wie unterhttp://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ beschrieben.

6
TroyWorks

Wenn Sie OSX/Chrome verwenden, können Sie das selbstsignierte SSL-Zertifikat zu Ihrem System-Schlüsselbund hinzufügen, wie hier erklärt: http://www.robpeck.com/2010/10/google-chrome-mac-os-x -und-selbstsignierte-SSL-Zertifikate

Es ist ein manueller Prozess, aber ich habe es endlich geschafft. Stellen Sie einfach sicher, dass der Common Name (CN) auf "localhost" (ohne den Port) gesetzt ist, und stellen Sie nach dem Hinzufügen des Zertifikats sicher, dass alle Trust-Optionen des Zertifikats auf "Always Trust" gesetzt sind. Stellen Sie außerdem sicher, dass Sie ihn zum Schlüsselbund "System" und nicht zum Schlüsselbund "login" hinzufügen.

4
Vijay Rudraraju

Wenn Sie Knoten verwenden, können Sie sie mit Knoten generieren. Dieses Modul scheint ziemlich voll ausgestattet zu sein:

Beachten Sie, dass ich nicht im laufenden Betrieb generieren würde. Generieren Sie mit einer Art Build-Skript, damit Sie über ein konsistentes Zertifikat und einen einheitlichen Schlüssel verfügen. Andernfalls müssen Sie das neu generierte selbstsignierte Zertifikat jedes Mal autorisieren.

3
B T

unter Windows habe ich das iis-Entwicklungszertifikat durch Verwendung von MMC (start> run> mmc) als vertrauenswürdig eingestuft. Anschließend fügen Sie das Zertifikat-Snapin hinzu, wählen "lokaler Computer" aus und akzeptieren die Standardeinstellungen. Wenn dieser Zertifikat-Snapip hinzugefügt wurde, erweitern Sie die Zertifikatstruktur des lokalen Computers, um unter Personal zu suchen. Wählen Sie das Zertifikat localhost aus, klicken Sie mit der rechten Maustaste> Alle Tasks> Exportieren. Übernehmen Sie alle Standardeinstellungen im Exportassistenten.

Erweitern Sie nach dem Speichern dieser Datei vertrauenswürdige Zertifikate, und importieren Sie das soeben exportierte Zertifikat. https://localhost vertraut jetzt darauf, dass Chrome keine Sicherheitswarnungen enthält.

Ich habe diesen Leitfaden Resolution # 2 aus dem MSDN-Blog verwendet, der Op hat auch einen Link in seiner Frage dazu geteilt, der sollte auch MMC verwenden, aber das hat für mich funktioniert . Resolution # 2

2
mushcraft

Es gibt mehr Aspekte dazu.

Sie können TLS (einige sagen immer SSL) mit einem Zertifikat erreichen, selbst signiert oder nicht.

Um eine grüne Leiste für ein selbstsigniertes Zertifikat zu haben, müssen Sie auch die Zertifizierungsstelle (Certificate Authority, CA) werden. Dieser Aspekt fehlt in den meisten Ressourcen, die ich auf meiner Reise zur Erreichung des grünen Balkens in meiner lokalen Entwicklungsumgebung gefunden habe. Eine Zertifizierungsstelle zu erstellen ist so einfach wie das Erstellen eines Zertifikats.

Diese Ressource deckt die Erstellung des CA-Zertifikats und eines Serverzertifikats ab. Daraufhin wurde bei meinem Setup in Chrome, Firefox und Edge ein lokaler grüner Balken angezeigt: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58)

Bitte beachten Sie: In Chrome müssen Sie das CA-Zertifikat Ihren vertrauenswürdigen Behörden hinzufügen.

2
Jos

Gehe zu: chrome://flags/

Aktivieren: Zulassen ungültiger Zertifikate für Ressourcen, die von localhost geladen wurden.

Sie haben nicht die grüne Sicherheit, aber Sie dürfen immer https: // localhost in chrome.

1
Alphapage

Mkcert von @FiloSottile macht diesen Prozess unendlich viel einfacher:

  1. Installiere mkcert , es gibt Anweisungen für macOS/Windows/Linux
  2. mkcert -install zum Erstellen einer lokalen Zertifizierungsstelle
  3. mkcert localhost 127.0.0.1 ::1 zum Erstellen eines vertrauenswürdigen Zertifikats für localhost im aktuellen Verzeichnis
  4. Sie verwenden einen Knoten (der den Systemstammspeicher nicht verwendet). Daher müssen Sie die Zertifizierungsstelle explizit angeben in einer Umgebungsvariablen, z. B .: export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. Führen Sie schließlich Ihren Express-Server mit dem Setup aus, das in verschiedenen anderen Antworten beschrieben wird (z. B. unten).
  6. boom. localhost schwimmt im grünen.

Grundknoteneinrichtung:

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
0
som

Einige der veröffentlichten Antworten enthielten Teile, die für mich sehr nützlich waren, um auch dieses Problem zu lösen. Ich war jedoch auch an der minimum Anzahl von Schritten interessiert und sollte OpenSSL idealerweise vermeiden (unter Windows 10).

Ein kritischer Punkt aus den Antworten (Kredit: @ TroyWorks ) besteht darin, dass Sie Ihre HOSTS-Datei bearbeiten müssen, um einen fiktiven Server zu erstellen, und diese 127.0.0.1 zuordnen. Dies setzt voraus, dass Sie die lokale Entwicklung durchführen.

In meinem Fall habe ich das SS-Zertifikat verwendet, um einen Websocket in NodeJS zu sichern, und der Socket wurde programmgesteuert (im Gegensatz zu einem Browser) verbunden. Für mich war es daher wichtig, dass das Zertifikat ohne Warnungen oder Fehler akzeptiert wurde, und das kritische Element bestand darin, das Zertifikat mit einem richtigen CN erstellen zu lassen (und natürlich das Zertifikat bei Trusted Authorities akzeptieren, wie an anderer Stelle in den Antworten beschrieben). . Mit IIS zum Erstellen eines selbstsignierten Zertifikats wird kein entsprechender CN erstellt. Daher habe ich den folgenden simple -Befehl mit Powershell entdeckt:

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

Dies muss in der PS-Administrationskonsole ausgeführt werden, funktioniert jedoch einfach und versetzt das cert in den Abschnitt "Personal" des LocalMachine-Zertifikatsspeichers. Sie können überprüfen, ob es erstellt wurde, indem Sie Folgendes ausführen:

ls cert:\LocalMachine\My 

Kopieren Sie dies einfach und fügen Sie es in "Trusted Root Certification Authorities" mit dem Zertifikats-Manager ein (stellen Sie sicher, dass Sie die Zertifikate des lokalen Computers und nicht den aktuellen Benutzer betrachten!).

Wenn Sie an dieses Zertifikat in IIS binden, sollten Sie in der Lage sein, https://gandalf.dummy.dev/ - zu besuchen und eine sichere Verbindung ohne Warnungen zu erhalten.

Das letzte Stück, das dies in NodeJS verwendet, ist oben und in anderen SO -Antworten beschrieben. Ich möchte nur hinzufügen, dass es unter Windows einfacher ist, mit einer pfx-Datei zu arbeiten, die den cert-Schlüssel und den privaten Schlüssel kombiniert. Sie können einen pfx problemlos aus dem Certificate Manager exportieren, was sich jedoch auf die Verwendung in NodeJS auswirkt. Wenn Sie einen Server mit dem "https" -Modul instanziieren, lauten die Optionen (anstelle von "key" und "cert") "pfx" und "passphrase", wie in:

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