使用godaddy gd_bundle.crt运行SSL node.js服务器

时间:2013-04-25 20:23:45

标签: node.js ssl https x509

我无法让我的SSL服务器使用来自godaddy的证书

使用Express:3.1.0

下面的内容是使用本地生成的密钥/ crt /不是由go daddy签名的(浏览器会抱怨,但是如果你添加了异常,那就可以了。

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协议错误。

说实话,我不是在创建他们的钥匙/证书我们的服务人员...我不确定如果我正在实施那些不正确的教父或者如果有办法确保他设置密钥/我可以解决问题/ crt文件正确....

有人看到明显错误的任何东西吗?

4 个答案:

答案 0 :(得分:26)

Node要求CA链中的每个证书都在数组中单独传递。 gd_bundle.crt可能看起来像这样:

-----BEGIN CERTIFICATE-----
MIIE3jCCA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEADCCA...
-----END CERTIFICATE-----

每个证书都需要放在自己的文件中(例如gd1.crtgd2.crt)并单独阅读。

https.createServer({
    key: fs.readFileSync('mysite.key'),
    certificate: fs.readFileSync('mysite.crt'),
    ca: [fs.readFileSync('gd1.crt'), fs.readFileSync('gd2.crt')]
});

答案 1 :(得分:10)

向GoDaddy询问 SHA-1签名中的ssl证书,并将捆绑文件分成两个文件,这样......

来自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-----

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

答案 2 :(得分:3)

最近,我在其中一个node.js服务器上遇到了与Godaddy的SSL证书类似的问题。在我的情况下,问题是我们的一个服务器使用PHP的curl函数验证SSL。

事实证明,在向Godaddy提交CSR时,我必须选择 SHA-1签名算法。我想它与旧系统更兼容。

答案 3 :(得分:3)

更简单

为什么只有GoDaddy的CA捆绑包才能为不同的环境保持相同的方法?例如,我只需要dev env的两个文件,但是生产使用的是GoDaddy证书,并且还有很多文件可以做什么?

对于GoDaddy,我将其捆绑并将其附加到单个文件中,并将扩展名命名为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阵列路由但是我对于特定版本可能是错误的。