node.js - 如何避免 node.js TLS 模块中的 SELF_SIGNED_CERT_IN_CHAIN 错误?

标签 node.js ssl openssl

我正在尝试使用 node.js v0.10.5 和 einaros/ws (WebSockets) 模块创建 TLS/SSL 连接,但出现以下错误:

错误:SELF_SIGNED_CERT_IN_CHAIN

我从我自己的 CA 获得我的证书,它是一个 EJBCA 服务器,版本:EJBCA 4.0.15 (r16671),我在我的客户端中使用以下代码:

define(["ws", "fs"], function (WebSocket, fs) {
"use strict";
return function (jsonRequest) {
    var response,
        error,
        successCallback,
        errorCallback,
        HB_PFX = "server.domain.com.p12",
        HB_CA = "certs/my-ca.pem";

    var secureOptions = {
        passphrase: "the-passphrase",
        pfx: fs.readFileSync(HB_PFX),
        ca : [fs.readFileSync(HB_CA)]
    };

    var sendRequest = function () {
        var client = new WebSocket("wss://server.domain.com:8080/draft", secureOptions);

        client.on("open", function () {
            client.send(jsonRequest);
        });
            client.on("error", function (e) {
            error = e.toString();
            console.log(error);
            if (errorCallback) {
                errorCallback(error);
            }
        });

        client.on("message", function (message) {
            response = message;
            if (successCallback) {
                successCallback(message);
            }
        });

        client.on("close", function (code) {
            console.log("Connection closed with code: " + code);
        });
    };

    return {
        send: function (callback) {
            if (response && !error) {
                callback(response);
            } else {
                successCallback = callback;
            }

            sendRequest();

            return this;
        },
        ifError: function (callback) {
            if (error) {
                callback(response);
            } else {
                errorCallback = callback;
            }

            return this;
        }
    };
};

});

p12 存储 (PKCS12) 由 CA 生成,它包含 key 、我的服务器证书和 CA 证书。

我可以毫无问题地使用浏览器连接到服务器,我只是在第一次连接时收到接受证书的提示。但是当我尝试与我的客户联系时,我总是会遇到该错误。我正在使用服务器的 FQDN 而不是 IP 地址连接到服务器。

如果我尝试使用自签名证书(在我的本地机器上生成的证书,而不是 p12 文件),我会收到 DEPTH_ZERO_SELF_SIGNED_CERT 错误。

我在 Mac OS X 10.8.4 上运行。

我几乎尝试了每一种排列,甚至将 key 和证书从 PKCS12 文件导出到 PEM 文件,但我得到了完全相同的错误。我还将 CA 证书添加到我在计算机中可以找到的所有 cacert 文件中,这些文件如下:

    /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts
    /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts
    /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/lib/security/cacerts
    /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts
    /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts
    /System/Library/Java/Support/Deploy.bundle/Contents/Home/lib/security/cacerts

有人知道如何解决这个错误并在 Node 中创建安全连接吗?

最佳答案

Does anybody know how to solve this error and create secure connections in node?

对于 Mac OS X 的情况,您需要将根证书(自签名,用于签名)放在您的 Keychain 中。

关于node.js - 如何避免 node.js TLS 模块中的 SELF_SIGNED_CERT_IN_CHAIN 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303564/

相关文章:

使用 AWS Elastic Load Balancing 的 SSL - 静态 IP?

python - 使用 Python 2.3 通过 SSL 发送邮件

c - 使用带有 EVP 接口(interface)的 AES/GCM 的段错误

node.js - Twilio 短信营销 Node 。命令无法启动应用程序并抛出错误 mac

javascript - 什么时候使用redis更好的优化?

node.js - Nodejs Express 使用表单中的数据查询 mongolab 以获取单个条目

cmake - 使用 OpenSSL 作为依赖项构建 CMake 项目

node.js - 比特桶管道 : Adding NodeJS for Gulp on the microsoft/dotnet:sdk image

facebook - 是否可以使用 Heroku 将 index.jsp 以外的文件放在 SSL 上?

c - 链接 OpenSSL 时对 t1sl_steup_key_block 的 undefined reference