2013-09-30 2 views
22

У меня есть сервер SSL в Express, который не работает во всех браузерах (если только пользователь не доверяет веб-сайту), поскольку некоторым браузерам требуется сертификат цепи (у нас есть собственный промежуточный сертификат). Я поместил наш промежуточный и цепной сертификат в один .crt-файл. Цепь + промежуточный сертификат находится в переменной INT_CERT_FILE. Кажется, это не работает. Я использую http://www.digicert.com/help, а также работает openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ ", чтобы проверить, но, похоже, он не возвращает сертификат промежуточной + цепи.Node.js/Express.js Chain Certificate Не работает

Вот как я устанавливаю его:

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

При посещении его на Firefox, Firefox не признает свою идентичность и требует, чтобы вручную доверять. Как я могу исправить эту проблему?

Thanks,

+0

я использовал. toString() после readFileSync (...) –

+0

Все еще не работает. http://www.digicert.com/help/ говорит, что сертификаты не найдены. – darksky

ответ

58

Имеет ли ваш файл промежуточного сертификата несколько блоков сертификатов?

Если это так, вы должны разделить их на разные файлы и прочитать их по одному. Вы можете передать их как массив в параметр ca.

Я получил это работает на код ниже:

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

Вы, сэр, спасли меня много времени. Спасибо. – tier1

+0

Это действительно работает? Документы nodejs говорят, что параметр 'ca' используется для авторизации соединений, и кажется, что он ничего не должен делать, если не включены опции' requestCert' и 'rejectUnauthorized'. https://nodejs.org/docs/latest-v0.10.x/api/tls.html#tls_tls_createserver_options_secureconnectionlistener –

+0

Моя проблема связана с nginx и [этой ссылкой] (https://cheapsslsecurity.com/blog/install -ssl-certificate-nginx-http-server /) разрешил это для меня. – tsuz

7

Handy маленький фрагмент кода, если вы на самом деле не может изменять SSL связанные файлы на сервере - вы можете разделить файл «цепь SSL» сам. Потратил некоторое время, когда пытались получить узел и Socket.io для работы с SSL (получаю ошибку нетто :: ERR_INSECURE_RESPONSE на клиенте), так думали поделимся:

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