【问题标题】:Running SSL node.js server with godaddy gd_bundle.crt使用 godaddy gd_bundle.crt 运行 SSL node.js 服务器
【发布时间】:2013-04-19 21:32:14
【问题描述】:

我无法让我的 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 人员所做的密钥/证书... crt 文件正确....

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

【问题讨论】:

    标签: node.js ssl https x509


    【解决方案1】:

    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')]
    });
    

    【讨论】:

    • 是的,在 gd_bundle.crt 里面似乎有两个 CA,我认为这很奇怪....所以你说我需要编辑它并将它们放在两个文件中并加载它们数组。我会试试这个谢谢!
    • 确认将每个 BEGIN CERTIFICATE ... END CERTIFICATE 块放在单独的文件中,然后使用此处所示的数组,对我有用。使用来自 comodo 的串联“apache 捆绑文件”解决了在桌面上看起来不错但在 android 上不受信任的网站。
    • 我尝试了同样的方法,但我收到了 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误。我收到了 2 个文件,1a67ca890634629a.crtgd_bundle-g2-g1.crt。我现在该怎么办?
    【解决方案2】:

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

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

    【解决方案3】:

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

    【讨论】:

    • 我从 Godaddy 收到了两个文件。一个较小,它只包含一个证书。另一个名为 gd_bundle-g2-g1.crt。我知道我需要破解它...但是我的密钥文件在哪里?
    • 您必须在服务器中生成 CSR 密钥文件,请在此处查看 GoDaddy 帮助support.godaddy.com/help/article/5276/…
    • 你也可以使用这个命令...$openssl genrsa -des3 -out www.yourdomain-example.com.key 2048
    • 如何拆分gd_bundle-g2-g1.crt文件?将证书块复制并粘贴到一个新文件中并以crt的扩展名保存就足够了?
    【解决方案4】:

    更简单

    既然您可以为不同的环境保持相同的方法,为什么只针对 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 数组路由的情况,但对于特定版本我可能是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2023-03-05
      • 2016-05-11
      相关资源
      最近更新 更多