créer un certificat SSL auto-signé de confiance pour l'hôte local (à utiliser avec Express / Node)

130

En essayant de suivre diverses instructions sur la création d'un certificat auto-signé à utiliser avec localhost, la plupart des instructions semblent être pour IIS, mais j'essaie d'utiliser Nodejs / Express. Aucun d'entre eux ne fonctionne correctement car bien que le certificat soit installé, il n'est pas approuvé. voici ce que j'ai essayé qui échoue:

Quelqu'un peut-il proposer un flux de travail capable de faire cela? Je peux obtenir un certificat installé, mais je ne peux pas faire confiance au certificat dans Chrome (v32) ou IE (v10).

EDIT: il a été suggéré dans les commentaires que le problème n'est pas un cert-root de confiance. J'ai installé le cert via IE mais il n'est toujours pas fiable.

JasonS
la source
Aucun des certificats auto-signés ne peut être rendu fiable pour les navigateurs Web. Ils ne sont pas signés par des signataires autorisés.
1
ce n'est pas vrai: vous pouvez installer un certificat racine pour obtenir la confiance de votre certificat auto-signé. cependant je n'arrive pas à le faire correctement. J'ai lu que vous pouvez installer la chaîne cert dans IE (pas dans chrome), alors j'ai essayé mais cela n'est toujours pas reconnu. Je ne sais pas si c'est parce que localhost est spécial ou si le certificat auto-signé n'est tout simplement pas correct.
JasonS
3
Je n'ai jamais obtenu de certificat auto-signé fonctionnant avec des navigateurs comme Chrome. Voici ma solution de contournement: j'ai créé une entrée DNS pour local.MYDOMAIN.com pointant vers 127.0.0.1 (localhost), puis j'utilise simplement mon certificat de production. Cela a l'avantage supplémentaire de vous assurer qu'il n'y a aucun problème avec votre chaîne de certification de production, etc.
JasonS

Réponses:

86

Les réponses ci-dessus étaient partielles. J'ai passé tellement de temps à faire fonctionner ça, c'est fou. Note à mon futur moi, voici ce que vous devez faire:

Je travaille sur Windows 10, avec Chrome 65. Firefox se comporte bien - il suffit de confirmer localhost comme une exception de sécurité et cela fonctionnera. Chrome ne:

Étape 1. dans votre backend, créez un dossier appelé security. nous allons y travailler.

Étape 2. Créez un fichier de configuration de demande nommé req.cnfavec le contenu suivant (le mérite revient à: @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

Une explication de ces champs est ici .

Étape 3. Accédez au dossier de sécurité dans le terminal et tapez la commande suivante:

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

Étape 4. puis en dehors du securitydossier, dans votre application express, faites quelque chose comme ceci: (le mérite revient à @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)
    })

Étape 5. Démarrez le serveur node server.jset accédez à https: // localhost: 3000 .

À ce stade, nous avons la configuration du serveur. Mais le navigateur devrait afficher un message d'avertissement.

Nous devons enregistrer notre certificat auto-signé, en tant qu'autorité de certification de confiance CA, dans le magasin de certificats chrome / windows. (Chrome enregistre également cela dans Windows,)

Étape 6. Ouvrez les outils de développement dans Chrome, allez dans le panneau Sécurité, puis cliquez sur Afficher le certificat. entrez la description de l'image ici

Étape 7. allez dans le panneau Détails, cliquez sur Copier le fichier, puis lorsque l'assistant d'exportation de certificat apparaît, cliquez sur Suivant comme ci-dessous:

aller aux détails - copier le fichier - suivant sur l'assistant d'exportation

Étape 8. laissez l'encodage DER, cliquez sur suivant, choisissez Browse, placez-le dans un dossier facile d'accès comme Desktop et nommez le certificat localhost.cer, then click Save and then Finish.. Vous devriez pouvoir voir votre certificat sur le bureau.

Étape 9. Ouvrez chrome://settings/en l'insérant dans la zone URL. En bas, cliquez sur Advanced / Advanced Options, puis faites défiler vers le bas pour trouver Manage Certificates.

choisissez gérer les certificats

Étape 10. Accédez au panneau Autorités de certification racines de confiance et cliquez sur importer.

Accédez au panneau Autorités de certification racines de confiance et cliquez sur importer

Nous importerons le localhost.cercertificat que nous venons de terminer l'exportation à l'étape 8.

Étape 11. Cliquez sur Parcourir, recherchez le localhost.cer, laissez les valeurs par défaut cliquez sur suivant plusieurs fois - jusqu'à ce que cet avertissement apparaisse, cliquez sur Oui.

confirmer l'exception de sécurité

Étape 12. Fermez tout et redémarrez Chrome. Ensuite, lorsque vous y allez, https://localhost:3000vous devriez voir: je dois aimer le vert

AIon
la source
Bonjour, lorsque j'ai terminé toutes les étapes que j'ouvre https://localhost:3000et que Chrome est bloqué lors du chargement. N'importe qui peut dire quelle pourrait en être la raison?
co.zohar
@ co.zohar un message dans la console? Appuyez sur crl+shift+iou F12pour ouvrir la console.
AIon
1
Si vous faites cela pour une adresse sur un réseau, j'ai trouvé que la configuration du certificat DNS sur un nom d'hôte tel que: DNS.1 = server.local Ensuite, sur la machine de connexion, mettez à jour le fichier HOSTS pour faire pointer l'adresse IP du serveur vers le nom d'hôte, par exemple: 192.168.0.50 server.localCela va permettre au certificat et à l'adresse de correspondre et valider le certificat.
roskelld
@AI sur la console n'affiche rien. La page affiche simplement: "En attente de l'hôte local ...". Avez-vous configuré quelque chose dans le fichier hosts?
co.zohar
1
J'ai trouvé une demi-réponse à ma propre question: si vous changez CN et DNS.1 en quelque chose comme "local.com" par exemple, et dans chaque ordinateur qui a besoin d'accéder au serveur, changez le fichier etc / hosts pour qu'il pointe local .com à l'adresse IP du serveur, cela fonctionne.
TKoL
111

Chemin le plus court. Testé sur MacOS, mais peut fonctionner de la même manière sur d'autres OS.

Générer pem

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

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

Votre serveur express

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)
})
  • Ouvrez https://localhost:3000dans Google Chrome et vous verrez que ce n'est pas sécurisé. Encore!
  • Dans Outils de développement> Sécurité> Afficher le certificat: faites glisser l'image sur votre bureau et double-cliquez dessus.
  • Cliquez sur 'Ajouter'
  • Trouvez-le dans Keychain Access et double-cliquez dessus
  • Développez «Faire confiance» et remplacez «Lors de l'utilisation de ce certificat» par «Toujours faire confiance».
  • Vous pouvez être invité à vous authentifier.
  • Redémarrez votre serveur.
  • Actualisez votre navigateur.
  • Prendre plaisir! :)
Diego Mello
la source
1
Voici un autre lien si vous souhaitez le faire sur Mac: certsimple.com/blog/localhost-ssl-fix .
John
Belle! Cela a fonctionné! J'aimerais ajouter: Installez OpenSSL à partir d'ici: indy.fulgan.com/SSL/?C=M;O=A . Obtenez le fichier .cnf à partir d'ici: puis configurez-le à partir d'ici: gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/… et configurez openSSL à partir d'ici: stackoverflow.com/questions/7360602/…
Jose A
2
Je voudrais ajouter que pour Chrome 58+, vous allez recevoir une erreur "Subject Alternative Name missing". stackoverflow.com/a/42917227/1057052 . Consultez les réponses ci-dessous pour plus d'aide: stackoverflow.com/a/43666288/1057052 , stackoverflow.com/a/44398368/1057052
Jose A
14
Drag image to your desktop and double click it-> Je ne peux rien faire glisser sur mon bureau, n'est pas déplaçable .. De quoi imageparlez-vous exactement?
AIon
7
Pour surmonter "Autre nom du sujet manquant" dans Chrome, vous pouvez le faire à la 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 3650place de la première ligne que vous avez suggérée. Et aussi celui-ci posera moins de questions dans le processus ...
Michael Litvin
78

Vous pouvez essayer openSSL pour générer des certificats. Jetez un œil à ceci .

Vous allez avoir besoin d'un fichier .key et .crt pour ajouter HTTPS au serveur JS express du nœud. Une fois que vous avez généré cela, utilisez ce code pour ajouter HTTPS au serveur.

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

Cela fonctionne bien dans ma machine locale ainsi que sur le serveur sur lequel j'ai déployé cela. Celui que j'ai sur le serveur a été acheté à goDaddy mais localhost avait un certificat auto-signé.

Cependant, chaque navigateur a généré une erreur indiquant que la connexion n'est pas approuvée, voulez-vous continuer. Après avoir cliqué sur Continuer, cela a bien fonctionné.

Si quelqu'un a déjà contourné cette erreur avec un certificat auto-signé, veuillez éclaircir.

Mars Robertson
la source
9
Votre certificat n'est toujours pas approuvé, vous rencontrez donc le même problème que je décris. J'ai besoin de lui faire confiance pour tester / déboguer correctement un service Web.
JasonS
1
Vous voulez donc que ce certificat ne soit approuvé que sur votre ordinateur local et non sur le réseau?
1
le lien en haut de la réponse recommande le cryptage 3DES 1024 bits, qui est bien dépassé. Mieux vaut utiliser openssl genrsa -out key.pem 2048pour une meilleure clé.
alimenté à vapeur
3
Votre certificat n'est toujours pas approuvé.
Diego Mello
2
le code express ci-dessus fonctionne, en utilisant github.com/FiloSottile/mkcert (au lieu de openSSL) pour créer un CA / certificat de confiance local. Des barres vertes tout le long.
som
11

Comment générer un certificat SSL pour localhost: lien

openssl genrsa -des3 -out server.key 1024

vous devez entrer un mot de passe ici que vous devez retaper dans les étapes suivantes

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

lorsqu'on lui a demandé «Nom commun», saisissez: localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
fuma
la source
1
C'est la solution que j'ai parcourue sur Internet au cours des 2 dernières heures. Pour tous les utilisateurs d'ubuntu, déplacez cp server.crt /usr/local/share/ca-certificates/.et exécutez les sudo update-ca-certificatesrequêtes https de l'hôte local Ensuite, elles fonctionnent sous NodeJS 8+. Id augmenter également1024 to 2048
Salyangoz
6

Voici ce qui fonctionne pour moi

sur windows

1) Ajoutez ceci à votre fichier% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net (car le navigateur a des problèmes avec 'localhost' (pour les scripts d'origine croisée)

Windows Vista et Windows 7 Vista et Windows 7 utilisent le contrôle de compte d'utilisateur (UAC), le Bloc-notes doit donc être exécuté en tant qu'administrateur.

  1. Cliquez sur Démarrer -> Tous les programmes -> Accessoires

  2. Cliquez avec le bouton droit sur Bloc-notes et sélectionnez Exécuter en tant qu'administrateur

  3. Cliquez sur Continuer dans la fenêtre UAC «Windows a besoin de votre autorisation».

  4. Lorsque le Bloc-notes s'ouvre Cliquez sur Fichier -> Ouvrir

  5. Dans le champ de nom de fichier, tapez C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. Cliquez sur Ouvrir

  7. Ajoutez ceci à votre fichier% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net

  8. sauver

  9. Fermer et redémarrer les navigateurs

Sur Mac ou Linux:

  1. Ouvrez / etc / hosts avec supermission
  2. Ajouter 127.0.0.1 localdev.YOURSITE.net
  3. Sauvegarde le

Lors du développement, vous utilisez localdev.YOURSITE.net au lieu de localhost, donc si vous utilisez des configurations d'exécution / débogage dans votre ide, assurez-vous de le mettre à jour.

Utilisez ".YOURSITE.net" comme domaine cookied (avec un point au début) lors de la création du cookiem, il devrait fonctionner avec tous les sous-domaines.

2) créez le certificat en utilisant ce localdev.url

CONSEIL: Si vous rencontrez des problèmes pour générer des certificats sous Windows, utilisez plutôt une machine VirtualBox ou Vmware.

3) importez le certificat comme indiqué sur http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

TroyWorks
la source
Salut Troy, merci de partager ça. Quelqu'un d'autre devra commenter si cela fonctionne ou non. Ma solution de contournement: j'ai fini par ajouter dev.phantomjscloud.com à mon fichier hosts, puis en utilisant mon certificat de production. Cela n'est utile que si vous voulez que vos clés de production soient disponibles sur votre boîte de développement, donc je pense que votre solution pourrait toujours être valide, si quelqu'un d'autre peut vérifier
JasonS
Cela fonctionne pour moi et mon équipe, de plusieurs manières, sécuriser le serveur local vers local pour sécuriser le serveur local vers le serveur de production.
TroyWorks
Pour Windows, la console git bash fonctionne très bien en utilisant les commandes openssl d' ici . Il vous suffit d'installer le certificat racine et vous pouvez créer plusieurs certificats spécifiques au site signés par celui-ci si vous le souhaitez.
Jason Goemaat
6

Mkcert de @FiloSottile rend ce processus infiniment plus simple:

  1. Installez mkcert , il y a des instructions pour macOS / Windows / Linux
  2. mkcert -install pour créer une autorité de certification locale
  3. mkcert localhost 127.0.0.1 ::1 pour créer un certificat approuvé pour localhost dans le répertoire actuel
  4. Vous utilisez node (qui n'utilise pas le magasin racine du système), vous devez donc spécifier explicitement l'autorité de certification dans une variable d'environnement, par exemple:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. Enfin, exécutez votre serveur express en utilisant la configuration décrite dans diverses autres réponses (par exemple ci-dessous)
  6. boom. localhost nage en vert.

Configuration de base du nœud:

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
la source
Fonctionne énormément! Avec cette approche, nous n'avons pas besoin d'enregistrer notre certificat auto-signé, en tant qu'autorité de certification de confiance CA, dans le magasin de certificats Chrome / Windows. Comme mentionné dans d'autres réponses.
zaheer
4

Si vous utilisez OSX / Chrome, vous pouvez ajouter le certificat SSL auto-signé à votre trousseau système comme expliqué ici: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and certificats-ssl-auto-signés

C'est un processus manuel, mais je l'ai finalement fait fonctionner. Assurez-vous simplement que le nom commun (CN) est défini sur "localhost" (sans le port) et une fois le certificat ajouté, assurez-vous que toutes les options de confiance sur le certificat sont définies sur "Toujours faire confiance". Assurez-vous également de l'ajouter au trousseau "Système" et non au trousseau "login".

Vijay Rudraraju
la source
Il mentionne IE, ce qui signifie qu'il utilise Windows.
2 bits
3

Si vous utilisez node, pourquoi ne pas les générer avec node? Ce module semble être assez complet:

Notez que je ne générerais pas à la volée. Générez avec une sorte de script de construction afin d'avoir un certificat et une clé cohérents. Sinon, vous devrez autoriser le certificat auto-signé nouvellement généré à chaque fois.

BT
la source
3

Certaines des réponses publiées contiennent des éléments qui m'ont été très utiles pour surmonter ce problème également. Cependant, j'étais également intéressé par le nombre minimum d'étapes et, idéalement, en évitant OpenSSL (sous Windows 10).

Ainsi, un élément essentiel des réponses (crédit: @ TroyWorks ) est que vous devez modifier votre fichier HOSTS pour créer un serveur fictif et le mapper à 127.0.0.1. Cela suppose que vous allez faire du développement local.

Dans mon cas, j'utilisais le certificat SS pour sécuriser un websocket dans NodeJS, et ce socket était connecté par programme (par opposition à via un navigateur). Donc, pour moi, il était essentiel que le certificat soit accepté sans avertissements ni erreurs, et l'élément critique était d'obtenir le certificat créé avec un CN approprié (et bien sûr d'accepter le certificat dans les autorités de confiance, comme décrit ailleurs dans les réponses) . L'utilisation d'IIS pour créer un certificat auto-signé ne créera pas le CN approprié, j'ai donc découvert la commande simple suivante à l' aide de Powershell:

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

Cela doit être exécuté dans la console d'administration PS, mais cela fonctionne simplement et place le certificat dans la section "Personnel" du magasin de certificats LocalMachine. Vous pouvez vérifier qu'il a été créé en exécutant:

ls cert:\LocalMachine\My 

Pour lui faire confiance, copiez-le simplement et collez-le dans «Autorités de certification racines de confiance» à l'aide du Gestionnaire de certificats (en vous assurant que vous regardez les certificats de la machine locale, pas l'utilisateur actuel!).

Si vous vous liez à ce certificat dans IIS, vous devriez pouvoir accéder à https://gandalf.dummy.dev/ et obtenir une connexion sécurisée sans aucun avertissement.

La dernière pièce, en utilisant cela dans NodeJS, est décrite ci-dessus et dans d'autres réponses SO, donc je n'ajouterai que sur Windows, il est plus facile de travailler avec un fichier pfx qui combine le certificat et la clé privée. Vous pouvez facilement exporter un pfx à partir du gestionnaire de certificats, mais cela affecte la façon dont vous l'utilisez dans NodeJS. Lors de l'instanciation d'un serveur à l'aide du module 'https', les options que vous utiliseriez (au lieu de 'key' et 'cert') seraient 'pfx' et 'passphrase', comme dans:

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

sous Windows, j'ai fait confiance au certificat de développement iis en utilisant MMC (démarrer> exécuter> mmc), puis j'ai ajouté le composant logiciel enfichable de certificat, en choisissant "ordinateur local" et en acceptant les valeurs par défaut. Une fois que ce composant logiciel enfichable de certificat est ajouté, développez l'arborescence des certificats de l'ordinateur local pour regarder sous Personnel, sélectionnez le certificat d'hôte local, cliquez avec le bouton droit> toutes les tâches> exporter. acceptez toutes les valeurs par défaut dans l'assistant d'exportation.

Une fois ce fichier enregistré, développez les certificats de confiance et commencez à importer le certificat que vous venez d'exporter. https://localhostfait désormais confiance à Chrome sans avertissement de sécurité.

J'ai utilisé cette résolution de guide n ° 2 du blog MSDN, l'op a également partagé un lien dans sa question à propos de cela devrait également utiliser MMC, mais cela a fonctionné pour moi. résolution n ° 2

Mushcraft
la source
2

Aller à: chrome://flags/

Activer: autorise les certificats non valides pour les ressources chargées à partir de l'hôte local.

Vous ne disposez pas de la sécurité verte, mais vous êtes toujours autorisé à utiliser https: // localhost dans Chrome.

Alphapage
la source
2

Il y a plus d'aspects à cela.

Vous pouvez atteindre TLS (certains continuent de dire SSL) avec un certificat, auto-signé ou non.

Pour avoir une barre verte pour un certificat auto-signé, vous devez également devenir l'autorité de certification (CA). Cet aspect manque dans la plupart des ressources que j'ai trouvées lors de mon parcours pour atteindre la barre verte dans ma configuration de développement local. Devenir une autorité de certification est aussi simple que de créer un certificat.

Cette ressource couvre la création à la fois du certificat CA et d'un certificat serveur et a abouti à ma configuration en affichant une barre verte sur localhost Chrome, Firefox et Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Remarque: dans Chrome, vous devez ajouter le certificat CA à vos autorités de confiance.

Jos
la source
0

Si vous devez aller plus loin que les étapes détaillées de @ alon et créer également un CA auto-signé:

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

En utilisant localhost.cnf comme décrit:

[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
momie
la source