2013-09-30 7 views
22

Mam serwer SSL w Express, który nie działa we wszystkich przeglądarkach (chyba że użytkownik ręcznie ufa stronie), ponieważ niektóre przeglądarki wymagają certyfikatu łańcucha (mamy własne certyfikat pośredni). Umieściłem nasz certyfikat pośredni i łańcuchowy w jednym pliku .crt. Łańcuch + pośredni certyfikat znajduje się w zmiennej INT_CERT_FILE. To nie działa. Używam http://www.digicert.com/help, a także sprawdzam pod kątem openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ ", ale wydaje się, że nie zwraca on certyfikatu pośredniego + łańcucha.Node.js/Express.js Certyfikat łańcucha Nie działa

Oto jak ja jej utworzeniu:

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

Odwiedzając go na Firefox, Firefox nie rozpoznaje swoją tożsamość i że należy je ręcznie ufać. Jak mogę rozwiązać ten problem?

Dziękujemy,

+0

użyłem. toString() po readFileSync (...) –

+0

Nadal nie działa. http://www.digicert.com/help/ nie znaleziono żadnych certyfikatów. – darksky

Odpowiedz

58

Czy plik pośredniego certyfikatu zawiera wiele bloków certyfikatów?

W takim przypadku należy podzielić je na różne pliki i przeczytać je po kolei. Możesz przekazać je jako tablicę do parametru ca.

Mam to praca z poniższym kodzie:

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

Jesteś pan, uratował mi dużo czasu. Dziękuję Ci. – tier1

+0

To faktycznie działa? Dokumenty nodejs mówią, że opcja 'ca' jest używana do autoryzacji połączeń i wygląda na to, że powinna nic nie robić, chyba że włączone są opcje' requestCert' i 'rejectUnaautized'. https://nodejs.org/docs/latest-v0.10.x/api/tls.html#tls_tls_createserver_options_secureconnectionlistener –

+0

Mój problem dotyczył nginx i [tego linku] (https://cheapsslsecurity.com/blog/install -ssl-certificate-nginx-http-server /) rozwiązało to dla mnie. – tsuz

7

Handy mały urywek, jeśli faktycznie nie można modyfikować żadnych plików związanych z SSL na serwerze - można podzielić plik „łańcuch” ssl siebie. Spędziłem trochę czasu, kiedy starał się węzeł i socket.io pracować z SSL (był coraz błąd netto :: ERR_INSECURE_RESPONSE na kliencie), więc myślałem, będzie go dzielić:

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

Powiązane problemy