在节点中安装自定义SSL证书(UNABLE_TO_VERIFY_LEAF_SIGNATURE)

时间:2017-12-31 07:10:21

标签: javascript node.js ssl https

我正在尝试访问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,因为我正在处理钱。

1 个答案:

答案 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提供。