SSLサーバーをgodaddyの証明書で動作させるのに問題があります
Expressの使用:3.1.0
以下では、ローカルで生成された/ Go Daddyによって署名されていないキー/ crtで機能します(ブラウザーは文句を言いますが、例外を追加すると機能します。
var http = require('https');
var privateKey = fs.readFileSync('/var/www/dev/ssl/server.key').toString();
var certificate = fs.readFileSync('/var/www/dev/ssl/server.crt').toString();
var credentials = {key: privateKey, cert: certificate};
var https = http.createServer(credentials, app);
godaddyでは、このように実装すると思われる追加のファイルGd_bundle.crtが提供されますが、エラーが発生します
var http = require('https');
var privateKey = fs.readFileSync('/var/www/prod/ssl/mysite.key').toString();
var certificate = fs.readFileSync('/var/www/prod/ssl/mysite.com.crt').toString();
var ca = fs.readFileSync('/var/www/prod/ssl/Gd_bundle.crt').toString();
var credentials = {key: privateKey, cert: certificate, ca: ca};
var https = http.createServer(credentials, app);
この構成では、次のようになります。エラー107(net :: ERR_SSL_PROTOCOL_ERROR):SSLプロトコルエラー。
真実は、私がdevopsの人が行うキー/証明書を作成していないと言われています... godaddyのものを正しく実装していない場合、または彼がキー/ crtファイルを正しくセットアップしていることを確認する方法がある場合、トラブルシューティングの方法がわかりません..。
誰かが露骨に明らかに間違っているものを見ていますか?
ノードでは、CAチェーン内の各証明書を配列で個別に渡す必要があります。 Gd_bundle.crt
おそらく次のようになります:
-----BEGIN CERTIFICATE-----
MIIE3jCCA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEADCCA...
-----END CERTIFICATE-----
各証明書は、独自のファイルに配置する必要があります(つまり、Gd1.crt
およびGd2.crt
)そして別々に読んでください。
https.createServer({
key: fs.readFileSync('mysite.key'),
certificate: fs.readFileSync('mysite.crt'),
ca: [fs.readFileSync('Gd1.crt'), fs.readFileSync('Gd2.crt')]
});
GoDaddyにSHA-1署名でSSL証明書を要求し、バンドルファイルを2つのファイルに分割します...
あなたのGd_bundle.crt
から
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldX
RQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8
-----END CERTIFICATE-----
TO Gd_bundle_01.crt
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-----END CERTIFICATE-----
AND Gd_bundle_02.crt
-----BEGIN CERTIFICATE-----
56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldX
RQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8
-----END CERTIFICATE-----
次に、サーバーでこれを実行します
var fs = require('fs'),
https = require('https');
var ssl = {
key: fs.readFileSync('./ssl/server.key', 'utf8'),
cert: fs.readFileSync('./ssl/server.crt', 'utf8'),
ca: [fs.readFileSync('./ssl/bundle_01.crt', 'utf8'),
fs.readFileSync('./ssl/bundle_02.crt', 'utf8')]
};
https.createServer(ssl, function(req, res) {
//... your code here ...
}).listen(443);
より単純
異なる環境で同じアプローチを維持できるのに、なぜGoDaddyのCAバンドルだけに限定するのですか?たとえば、dev envには2つのファイルしか必要ありませんが、本番環境ではGoDaddy証明書を使用しており、何をすべきかがたくさんあります。
GoDaddyの場合、バンドルを1つのファイルに追加し、拡張子にPEMと、すべてのタイプの証明書にかなり標準的なアプローチを提供するキーファイルという名前を付けます。
次に、すべての環境でこれを実行することになります。
server = https.createServer({
key: fs.readFileSync(config.sslKey),
cert: fs.readFileSync(config.sslCert),
},app).listen(config.sslPort);
GoDaddy cert.pemファイルに、証明書とバンドルファイルを1からx(上から下)に配置するだけで、次のようになります。
-----BEGIN CERTIFICATE-----
site certificate goes here
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA 1 goes here
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA 2 goes here
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA X goes here
-----END CERTIFICATE-----
必ずしも良いとは限りませんが、私はそれを好みます。 Express 3.xでは、CAアレイルートを実行する必要があることに気づきませんでしたが、特定のバージョンでは間違っている可能性があります。
最近、node.jsサーバーの1つにあるGodaddyのSSL証明書で同様の問題が発生しました。私の場合、問題は、サーバーの1つがPHPのcurl関数を使用してSSLを検証することにありました。
CSRをGodaddyに送信するときに、SHA-1署名アルゴリズムを選択する必要があったことがわかりました。古いシステムとの互換性が高いと思います。