我们正试图使用Node.js(和Mocha)作为测试框架,对内部服务器上的API调用进行https测试。我们正在使用以下Node模块:Mocha、Restify和Should来执行这些测试。
当我们运行mocha testFileName.js时,我们得到的主要错误是:
我们尝试过多个版本的Node、OpenSSL以及不同的安装方法,包括下载软件包与使用homebrew。
计算机信息:
- Mac OS X 10.8.4(也尝试过10.8.3) - Node v0.8.18(也尝试过:Node v0.10.11、v0.10.12) - OpenSSL v1.0.1e(也尝试过0.9.8)
头脑风暴问题:
Node.js是否使用其自己打包的OpenSSL版本,而非本地安装的版本? 如果是这样,它在哪里查找证书? TLS.js是否告诉Node在其他地方查找证书? 有没有实用的方法来覆盖使用的证书?看起来可能有我们可以使用的选项,就像这样:
当我们运行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)
经过在谷歌和 stackexchange 上的搜索,我们发现了一个证书问题。因此,我们安装了内部 CA“public”证书,以及我们的应用程序正在使用的特定实例证书(需要多个重定向)。
/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.
在将证书安装到这些位置之前,我们无法在命令行上“curl”访问我们的网站而不出现证书错误;但是,现在安装了它们后,我们没有错误,但是Node仍然会崩溃。我们尝试过多个版本的Node、OpenSSL以及不同的安装方法,包括下载软件包与使用homebrew。
计算机信息:
- Mac OS X 10.8.4(也尝试过10.8.3) - Node v0.8.18(也尝试过:Node 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) {
...
});
但这会产生相同的错误。