web-dev-qa-db-fra.com

créer un certificat SSL auto-signé de confiance pour localhost (à utiliser avec Express/Node)

Essayer de suivre diverses instructions sur la création d’un certificat auto-signé pour une utilisation avec localhost. La plupart des instructions semblent concerner IIS, mais j’essaie d’utiliser Nodejs/Express. Aucun d'entre eux ne fonctionne correctement car, même si le certificat est installé, il n'est pas approuvé. voici ce que j'ai essayé qui échoue:

Quelqu'un peut-il offrir un flux de travail capable de le faire? Je peux obtenir un certificat installé, mais Je ne peux pas obtenir que le certificat soit approuvé en chrome (v32) ou IE (v10). 

EDIT: il a été suggéré dans les commentaires que le problème n'est pas une racine de certificat de confiance. J'ai installé le CERT via IE mais on ne fait toujours pas confiance. 

97
JasonS

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

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:3000 dans 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 cliquez deux fois dessus.
  • Cliquez sur 'Ajouter'
  • Trouvez-le dans Keychain Access et double-cliquez dessus
  • Développez «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! :)
88
Diego Mello

Vous pouvez essayer openSSL pour générer des certificats . Regardez this .

Vous allez avoir besoin d'un fichier .key et d'un fichier .crt pour ajouter HTTPS au noeud JS Express Server. 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 correctement sur ma machine locale ainsi que sur le serveur sur lequel je l'ai déployé. Celui que j'ai dans le serveur a été acheté de goDaddy mais localhost avait un certificat auto-signé.

Cependant, chaque navigateur a émis une erreur indiquant que la connexion n’était pas fiable. Voulez-vous continuer? Après que je clique sur Continuer, cela a bien fonctionné. 

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

76
user1741851

Les réponses ci-dessus étaient partielles. J'ai passé tellement de temps à faire en sorte que cela fonctionne, 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 - confirmez simplement localhost en tant qu'exception de sécurité et cela fonctionnera. Chrome ne:

Étape 1. dans votre backend, créez un dossier appelé security. nous allons travailler à l'intérieur.

Étape 2. crée un fichier de configuration de requête nommé req.cnf avec le contenu suivant (le crédit va à: @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. naviguez jusqu'au dossier de sécurité du 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 dossier security, dans votre application express, procédez comme suit: (le crédit 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.js et 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 approuvée de CA, dans le magasin de certificats de chrome/windows. (chrome enregistre également ceci dans Windows,)

Étape 6. ouvrez Outils de développement chromés, ouvrez le panneau Sécurité, puis cliquez sur Afficher le certificat .  enter image description here

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

 go to details - copy file - next on export wizard

Étape 8. quittez le codage DER, cliquez sur suivant, choisissez Browse, placez-le dans un dossier facile d'accès, tel que Bureau, 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 case URL. En bas, cliquez sur Advanced / Advanced Options, puis faites défiler pour trouver Manage Certificates.

 choose manage certificates

Étape 10. Accédez au panneau des autorités de certification racines de confiance, puis cliquez sur importer.

 Go to Trusted Root Certification Authorities panel, and click import

Nous allons importer le certificat localhost.cer que nous venons juste d'exporter à l'étape 8.

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

 confirm security exception

Étape 12. ferme tout et redémarre chrome. Ensuite, en allant à https://localhost:3000, vous devriez voir:  gotta love the green

29
AIon

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

openssl genrsa -des3 -out server.key 1024

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

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

à la question "Nom commun", entrez: localhost

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

Voici ce qui fonctionne pour moi

sur les fenêtres

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

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

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

  2. Cliquez avec le bouton droit de la souris et sélectionnez Exécuter en tant qu’administrateur.

  3. Cliquez sur Continuer dans la fenêtre UAC "Windows requiert votre autorisation".

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

  5. Dans le champ Nom du 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. Sauvegarder

  9. Fermer et redémarrer les navigateurs

Sur Mac ou Linux:

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

Lorsque vous développez, utilisez localdev.YOURSITE.net au lieu de localhost, donc si vous utilisez des configurations run/debug dans votre ide, veillez à le mettre à jour.

Utilisez ".YOURSITE.net" en tant que domaine_moyen (avec un point au début) lors de la création du cookiem, il devrait alors fonctionner avec tous les sous-domaines.

2) crée le certificat en utilisant le fichier localdev.url

CONSEIL: Si vous rencontrez des problèmes lors de la génération de certificats sous Windows, utilisez plutôt une machine VirtualBox ou VMware. 

3) importer le certificat comme indiqué surhttp://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

6
TroyWorks

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 -et-auto-signé-certificats-ssl

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 du certificat sont définies sur "Toujours faire confiance". Assurez-vous également de l'ajouter au trousseau "Système" et non au trousseau "Connexion".

4
Vijay Rudraraju

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 un certain type de script de construction pour obtenir un certificat et une clé cohérents. Sinon, vous devrez autoriser à chaque fois le certificat auto-signé nouvellement généré.

3
B T

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 de certificats de l'ordinateur local et examinez sous Personnel, sélectionnez le certificat localhost, cliquez avec le bouton droit de la souris sur> toutes les tâches> exportation. accepte toutes les valeurs par défaut de 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://localhost est maintenant approuvé en chrome sans aucun avertissement de sécurité.

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

2
mushcraft

Il y a plus d'aspects à cela.

Vous pouvez obtenir le protocole TLS (certains disent sans cesse 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. Cet aspect est absent de la plupart des ressources trouvées lors de mon parcours pour atteindre la barre verte dans ma configuration de développement local. Devenir CA est aussi simple que créer un certificat.

Cette ressource couvre la création du certificat de l'autorité de certification et d'un certificat de serveur. Par conséquent, mon installation a affiché une barre verte sur les hôtes locaux Chrome, Firefox et Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

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

2
Jos

Aller à: chrome://flags/

Activer: Autorise les certificats non valides pour les ressources chargées à partir de localhost.

Vous n'avez pas la sécurité verte, mais vous êtes toujours autorisé pour https: // localhost in chrome.

1
Alphapage

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 de confiance pour localhost dans le répertoire actuel
  4. Vous utilisez un noeud (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, lancez votre serveur express en utilisant la configuration décrite dans diverses autres réponses (par exemple, ci-dessous).
  6. boom. localhost nage dans le vert.

Configuration de base du noeud:

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

Certaines des réponses publiées contiennent des éléments qui m’ont été très utiles pour surmonter également ce problème. Cependant, je m'intéressais aussi au nombre d'étapes minimum et, idéalement, à éviter OpenSSL (sous Windows 10).

Donc, 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 une prise Web dans NodeJS, et cette prise était connectée à un programme (et non via un navigateur). Donc, pour moi, il était essentiel que le certificat soit accepté sans avertissement ni erreur, et la pièce essentielle consistait à créer le certificat avec un CN approprié (et bien sûr l'accepter dans les autorités de confiance, comme décrit ailleurs dans les réponses). . Utiliser 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 PS Admin, mais cela fonctionne simplement et place le certificat dans la section "Personnel" du magasin de certificats de LocalMachine . Vous pouvez vérifier qu'il a bien été créé en exécutant:

ls cert:\LocalMachine\My 

Pour y faire confiance, copiez-le simplement et collez-le dans "Autorités de certification racines de confiance" à l'aide de Certificate Manager (en vous assurant que vous regardez bien les certificats de l'ordinateur local et non de l'utilisateur actuel!).

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

La dernière pièce, qui utilise ceci dans NodeJS, est décrite ci-dessus et dans d'autres réponses SO. Par conséquent, j'ajouterai que sous Windows, il est plus facile de travailler avec un fichier pfx combinant cert et clé privée. Vous pouvez exporter facilement un pfx à partir du gestionnaire de certificats, mais cela a une incidence sur 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 "clé" et "cert") seraient "pfx" et "phrase secrète", comme dans:

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