20

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

使用快递: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 人员所做的密钥/证书... ……

有没有人看到明显明显的错误?

4

4 回答 4

28

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')]
});
于 2013-04-25T21:39:56.197 回答
11

向 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-----

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);
于 2014-06-23T17:06:12.533 回答
3

最近,我在我们的一台 node.js 服务器上遇到了 Godaddy 的 SSL 证书类似的问题。就我而言,问题在于我们的一台服务器使用 PHP 的 curl 函数验证 SSL。

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

于 2014-03-08T00:18:00.557 回答
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 数组路由的情况,但对于特定版本我可能是错误的。

于 2015-02-10T02:42:37.220 回答