我正在尝试访问API,但是我收到以下错误:
{ FetchError: request to https://www.cryptopia.co.nz/api/GetMarkets failed, reason: unable to verify the first certificate
at ClientRequest.<anonymous> (.../node_modules/node-fetch/index.js:133:11)
at ClientRequest.emit (events.js:159:13)
at TLSSocket.socketErrorListener (_http_client.js:389:9)
at TLSSocket.emit (events.js:159:13)
at emitErrorNT (internal/streams/destroy.js:64:8)
at process._tickCallback (internal/process/next_tick.js:152:19)
name: 'FetchError',
message: 'request to https://www.cryptopia.co.nz/api/GetMarkets failed, reason: unable to verify the first certificate',
type: 'system',
errno: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' }
我尝试使用ssl-root-cas
,我尝试使用NODE_EXTRA_CA_CERTS
手动添加证书。这些都没有奏效。
API用于加密货币交换。我可以使用Chrome连接到它。我使用了一些SSL扫描仪,我得到“这个服务器的证书链不完整。”以下是其中一个扫描仪的结果:https://www.ssllabs.com/ssltest/analyze.html?d=www.cryptopia.co.nz
经过一段谷歌搜索后,看起来错误是由Node未下载中间证书引起的。 Chrome已下载,因此Chrome运行良好。我使用Chrome将证书下载为.cer
文件,使用OpenSSL将其转换为.pem
文件,然后使用Node的NODE_EXTRA_CA_CERTS
加载它,但它没有做任何事情。< / p>
如何解决此问题?
我无法对服务器进行更改。我联系了Cryptopia,但可能需要几周的时间来回复。显然,我不打算禁用严格的SSL,因为我正在处理钱。
答案 0 :(得分:1)
您需要为您的应用程序提供整个CA链,即缺少的中间CA证书和根证书:
options=require('url').parse('https://www.cryptopia.co.nz/api/GetMarkets');
options.ca = require('fs').readFileSync('myca.pem');
require('https').get(options, (r) => {
console.log(r.headers)
});
myca.pem
在此处是中间“COMODO RSA扩展验证安全服务器CA”和根“COMODO RSA证书颁发机构”的证书的PEM表示的串联。我已将其作为pastebin here提供。