Мы пытаемся использовать Node.js(и Mocha) в качестве основы тестирования для тестирования вызовов API с внутренним сервером по https. Мы используем следующие модули node: 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 '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.
Перед установкой сертификатов в этих местах мы не смогли "скрутить" наш сайт без ошибок сертификата в командной строке; однако при их установке теперь мы не получаем ошибок, но 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) {
...
});
Но это порождает нашу ту же ошибку.