我们正在尝试使用 Node.js(和 Mocha)作为测试框架来测试通过 https 对内部服务器的 API 调用。我们使用以下节点模块:Mocha、Restify 和 Should 执行这些测试。
当我们运行 mocha testFileName.js 时,我们得到的主要错误是:
[2013-06-19 14:16:28.105] [ERROR] console - FAIL: Received error! [Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE
at SecurePair.<anonymous> (tls.js:1283:32)
at SecurePair.EventEmitter.emit (events.js:92:17)
at SecurePair.maybeInitFinished (tls.js:896:10)
at CleartextStream.read [as _read] (tls.js:430:15)
at CleartextStream.Readable.read (_stream_readable.js:320:10)
at EncryptedStream.write [as _write] (tls.js:344:25)
at doWrite (_stream_writable.js:219:10)
at writeOrBuffer (_stream_writable.js:209:5)
at EncryptedStream.Writable.write (_stream_writable.js:180:11)
at write (_stream_readable.js:573:24)
at flow (_stream_readable.js:582:7)
at Socket.pipeOnReadable (_stream_readable.js:614:5)
at Socket.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
at emitReadable (_stream_readable.js:404:5)
at readableAddChunk (_stream_readable.js:165:9)
at Socket.Readable.push (_stream_readable.js:127:10)
at TCP.onread (net.js:511:21)
在搜索 google 和 stackexchange 之后,我们似乎遇到了证书问题。从那里我们安装了内部 CA“公共”证书,以及我们的应用程序正在使用的特定于实例的证书(有多个重定向要通过),以
/usr/local/etc/openssl/certs, legacy: /System/Library/Keychains/X509Anchors, /Library/Keychains/System.keychain, as well as in Keychain through the gui to our login and System keychains. However, we're still not getting anywhere.
在这些地方安装证书之前,我们无法“卷曲”我们的网站而不会在命令行上出现证书错误;但是,现在安装它们后,我们没有收到任何错误,但节点仍然爆炸。
我们尝试了多个版本的 Node、OpenSSL,以及不同的安装方法,包括下载软件包与使用自制软件。
电脑信息:
- Mac OS X 10.8.4(也尝试使用 10.8.3)
- 节点 v0.8.18(也尝试过:节点 v0.10.11、v0.10.12)
- OpenSSL v1.0.1e(也尝试使用 0.9.8)
头脑风暴问题:
Node.js 是否使用它自己的(捆绑的)版本的 OpenSSL 而不是本地机器上安装的?如果是这样,它在哪里寻找证书?TLS.js 会告诉 Node 在别处寻找证书吗?是否有一种务实的方法来覆盖所使用的证书;看来我们可以使用这样的选项:
var options = {
ca: fs.readFileSync("[path to our CA cert file]"),
requestCert: true,
rejectUnauthorized: true
};
var req = https.request(options, function(res) {
...
});
但这会产生我们同样的错误。