2013-09-30 27 views
22

ブラウザにはチェーン証明書が必要なため、すべてのブラウザで動作していないExpressサーバーがあります(ユーザーが手動で信頼する場合を除きます)中間証明書)。中間とチェーンの証明書を1つの.crtファイルに入れました。チェーン+中間証明書はINT_CERT_FILE変数にあります。それは動作していないようです。 http://www.digicert.com/helpを使用していますが、確認するのにopenssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ "を実行していますが、中間チェーン証明書が返されていないようです。ここでNode.js/Express.jsチェーン証明書が動作していません

が、私はそれを設定してい方法は次のとおりです。

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はそのアイデンティティを認識し、手動で信頼されるように、それを必要としません。この問題を解決するにはどうすればよいですか?

ありがとう、

+0

:ノードを取得しようとしましたし、SSLで動作するようにsocket.ioたときに少しの間を費やしたので、それを共有する考え(クライアント上のネット:: ERR_INSECURE_RESPONSEエラーを得ていました)。 readFileSync(...)の後のtoString() –

+0

まだ動作しません。 http://www.digicert.com/help/には証明書が見つかりません。 – darksky

答えて

58

中間証明書ファイルに複数の証明書ブロックが含まれていますか?

この場合、別のファイルに分割して1つずつ読む必要があります。それらを配列としてcaパラメータに渡すことができます。

私はそれが以下のコードで作業を持っている

:あなたが実際にサーバ上で任意のSSL関連ファイルを変更できない場合

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と[this link](https://cheapsslsecurity.com/blog/install)です。 -ssl-certificate-nginx-http-server /)は私のためにそれを解決しました。 – tsuz

7

ハンディ少しスニペット - あなたは「SSLチェーン」ファイルを分割することができますあなた自身。私が使用し

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

関連する問題