2013-09-30 22 views
22

Ich habe einen SSL-Server in Express, der nicht auf allen Browsern funktioniert (es sei denn, der Benutzer vertraut der Website manuell), da einige Browser das Kettenzertifikat benötigen (wir haben unser eigenes) Zwischenzertifikat). Ich habe unser Zwischen- und Kettenzertifikat in einer .crt-Datei gespeichert. Das Ketten + Zwischenzertifikat befindet sich in der INT_CERT_FILE Variable. Es scheint nicht zu funktionieren. Ich verwende http://www.digicert.com/help, sowie die Ausführung openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ " zu überprüfen, aber es scheint nicht, die Zwischen + Kettenzertifikat zurückzugeben.Node.js/Express.js Kettenzertifikat funktioniert nicht

Hier ist, wie ich es bin Einrichtung:

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

Wenn es auf Firefox zu besuchen, ist Firefox nicht seine Identität zu erkennen und erfordert es manuell zu trauen. Wie kann ich dieses Problem beheben?

Danke,

+0

I verwendet. toString() nach dem readFileSync (...) –

+0

Funktioniert immer noch nicht. http://www.digicert.com/help/ sagt keine Zertifikate gefunden. – darksky

Antwort

58

Enthält Ihre Zwischenzertifikatsdatei mehrere Zertifikatsblöcke?

Wenn das der Fall ist, sollten Sie sie in verschiedene Dateien aufteilen und sie nacheinander lesen. Sie können sie als Array an den Parameter ca übergeben.

ich habe es funktioniert mit dem folgenden Code:

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) { 
    // ... 
}); 
+0

Sie Sir, rettete mich eine Menge Zeit. Vielen Dank. – tier1

+0

Das funktioniert eigentlich? Die nodejs-Dokumentation sagt, dass die 'ca'-Option zum Autorisieren von Verbindungen verwendet wird, und es scheint, als ob sie nichts tun sollte, wenn die Optionen 'requestCert' und' rejectUnauthorized' nicht aktiviert sind. https://nodejs.org/docs/latest-v0.10.x/api/tls.html#tls_tls_createserver_options_secureconnectionlistener –

+0

Mein Problem war mit nginx und [dieser Link] (https://cheapsslsecurity.com/blog/install -ssl-certificate-nginx-http-server /) löste es für mich. – tsuz

7

handliche kleine Schnipsel, wenn Sie tatsächlich keine SSL-bezogene Dateien auf dem Server ändern können - können Sie die „ssl Kette“ Datei geteilt dich selber. Verbrachte eine Weile, wenn Knoten zu bekommen versucht und Socket.io mit SSL arbeiten (wurde immer net :: ERR_INSECURE_RESPONSE Fehler auf dem Client), so wird angenommen, teilen:

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

Verwandte Themen