2013-09-30 68 views
22

Tôi có máy chủ SSL Express, không hoạt động trên tất cả trình duyệt (trừ khi người dùng tự tin tưởng trang web) vì một số trình duyệt yêu cầu chứng chỉ chuỗi (chúng tôi có chứng chỉ trung gian). Tôi đã đặt chứng chỉ trung gian và chuỗi trong một tệp .crt. Chuỗi + chứng chỉ trung gian nằm trong biến số INT_CERT_FILE. Nó dường như không hoạt động. Tôi đang sử dụng http://www.digicert.com/help, cũng như chạy openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ " để kiểm tra nhưng có vẻ như không trả lại chứng chỉ chuỗi trung gian.Chứng chỉ chuỗi Node.js/Express.js Không hoạt động

Đây là cách tôi đang thiết lập nó lên:

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

Khi truy cập nó trên Firefox, Firefox không nhận ra danh tính của mình và đòi hỏi nó phải được tin cậy bằng tay. Làm cách nào để khắc phục sự cố này?

Xin cảm ơn,

+0

tôi đã sử dụng. toString() sau khi readFileSync (...) –

+0

Vẫn không hoạt động. http://www.digicert.com/help/ cho biết không tìm thấy chứng chỉ nào. – darksky

Trả lời

58

Tệp chứng chỉ trung gian của bạn có chứa nhiều khối chứng chỉ không?

Nếu đó là trường hợp bạn nên chia chúng thành các tệp khác nhau và đọc từng tệp một. Bạn có thể chuyển chúng thành một mảng với tham số ca.

tôi đã nhận nó làm việc với mã dưới đây:

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

Bạn thưa ông, đã cứu tôi rất nhiều thời gian. Cảm ơn bạn. – tier1

+0

Điều này thực sự hoạt động? Các tài liệu nodejs nói rằng tùy chọn 'ca' được sử dụng để cho phép các kết nối và có vẻ như nó sẽ không làm gì trừ khi các tùy chọn' requestCert' và 'rejectUnauthorized' được bật. https://nodejs.org/docs/latest-v0.10.x/api/tls.html#tls_tls_createserver_options_secureconnectionlistener –

+0

Vấn đề của tôi là liên quan đến nginx và [liên kết này] (https://cheapsslsecurity.com/blog/install -ssl-certificate-nginx-http-server /) đã giải quyết nó cho tôi. – tsuz

7

Handy đoạn nhỏ nếu bạn thực sự không thể sửa đổi bất kỳ tập tin SSL liên quan đến trên máy chủ - bạn có thể chia nhỏ các "ssl chuỗi" tập tin bản thân bạn. Dành một chút thời gian khi cố gắng để có được Node và socket.io để làm việc với SSL (đã nhận lỗi net :: ERR_INSECURE_RESPONSE trên máy khách) nên nghĩ sẽ chia sẻ nó:

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

Các vấn đề liên quan