web-dev-qa-db-fra.com

Certificat de chaîne Node.js / Express.js ne fonctionne pas

J'ai un serveur SSL dans Express, qui ne fonctionne pas sur tous les navigateurs (sauf si l'utilisateur fait confiance manuellement au site Web) car certains navigateurs nécessitent le certificat de chaîne (nous avons notre propre certificat intermédiaire). J'ai mis notre certificat intermédiaire et de chaîne dans un fichier .crt. Le certificat chaîne + intermédiaire est dans le INT_CERT_FILE variable. Ça n'a pas l'air de marcher. J'utilise http://www.digicert.com/help , ainsi que l'exécution de openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ " à vérifier, mais il ne semble pas renvoyer le certificat intermédiaire + chaîne.

Voici comment je le configure:

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

var KEY_FILE = fs.readFileSync("path/to/key/file.key");
var CERT_FILE = fs.readFileSync("path/to/crt/file.crt);
var INT_CERT_FILE = fs.readFileSync("path/to/intermediate and chain crt.crt");

var _app_https = express();
var _server_https = null;

_server_https = https.createServer({
    key: KEY_FILE,
    cert: CERT_FILE,
    ca: INT_CERT_FILE
}, _app_https).listen(443);

Lorsque vous le visitez sur Firefox, Firefox ne reconnaît pas son identité et nécessite qu'il soit approuvé manuellement. Comment puis-je résoudre ce problème?

Merci,

27
darksky

Votre fichier de certificat intermédiaire contient-il plusieurs blocs de certificat?

Si tel est le cas, vous devez les diviser en différents fichiers et les lire un par un. Vous pouvez les passer sous forme de tableau au paramètre ca.

Je l'ai avec le code ci-dessous:

var https = require('https'),
    read = require('fs').readFileSync,
    httpsOptions = {
        key: read('ssl/mycertificate.key', 'utf8'),
        cert: read('ssl/mycertificate.crt', 'utf8'),
        ca: [
            read('ssl/rapidssl_1.pem', 'utf8'),
            read('ssl/rapidssl_2.pem', 'utf8')
        ]
    };

https.createServer(httpsOptions, function (req, res) {
    // ...
});
64
Jeroen Moors

Petit extrait pratique si vous ne pouvez pas modifier de fichiers SSL sur le serveur - vous pouvez diviser le fichier "chaîne SSL" vous-même. J'ai passé un peu de temps à essayer d'obtenir Node et socket.io pour travailler avec SSL (obtenait l'erreur net :: ERR_INSECURE_RESPONSE sur le client) alors la pensée le partagera:

var read = require('fs').readFileSync;
var privateKey = read(MY_KEY_LOCATION, 'utf8');
var certificate = read(MY_CERT_LOCATION, 'utf8');
var chainLines = read(MY_CHAIN_LOCATION, 'utf8').split("\n");
var cert = [];
var ca = [];
chainLines.forEach(function(line) {
  cert.Push(line);
  if (line.match(/-END CERTIFICATE-/)) {
    ca.Push(cert.join("\n"));
    cert = [];
  }
});
var credentials = {
  "key": privateKey,
  "cert": certificate,
  "ca": ca
};
var httpsServer = https.createServer(credentials, app);
var io = require('socket.io').listen(httpsServer);
8
alchemication