如何将自定义证书颁发机构(CA)添加到nodejs

我正在使用CLI工具来构build混合移动应用程序,它具有很酷的上传function,所以我可以在设备上testing应用程序,而无需通过应用程序商店(它是离子版)。 但是,在我的公司中,像许多其他公司一样,TLS请求与公司自己的定制CA证书(我在我的机器上的钥匙串(OS X)中)一起重新签名。 但是,nodejs不使用钥匙串来获取其信任列表。 我不控制ionic-cli应用程序,所以我不能简单地将{ca:}属性传递给https模块。 我也可以看到这是任何我不控制的节点应用程序的问题。 是否有可能告诉nodejs信任一个CA?

我不确定这是属于信息安全还是其他交易所?

除非使用自定义CA证书编译自定义版本的nodejs,否则目前这是不可能的。 直到有人提交了一个PR并将其合并后,硬件上的CA证书才是当前nodejs的限制。 这对其他人也是一个问题。

下面我有一些可能帮助一些人,但可能不是OP的解决方法的副本。

据我所知OP可以:

  • 自定义编译nodejs
  • 提交一个关于nodejs的PR来解决这个问题
  • 使用ionic-cli提交问题或PR来支持自定义CA证书: https : //github.com/driftyco/ionic-cli (由@Natebuild议)
  • 减less安全性(@Nate也不提供TLS或静默validation)

其他人,如果你控制nodejs应用程序的问题,你有更多的select。 您当然可以在每个请求中指定ca证书。 一些聪明的人在github问题https://github.com/nodejs/node/issues/4175中分享了一些解决方法。 我还没有尝试过这些,所以没有任何承诺,我只是分享了我读过的东西。

DuBistKomisch解释了如何让nodejs使用操作系统的CA证书:

我的解决方法是手动加载和parsing系统CA证书。 然后,按照请求文档的build议,在我们提出请求的任何地方都将它们传递给ca选项。 我想你也可以在全局代理上设置ca,如果这对你的用例有效的话。

fs.readFileSync('/etc/ssl/certs/ca-certificates.crt') .toString() .split(/-----END CERTIFICATE-----\n?/) // may include an extra empty string at the end .filter(function (cert) { return cert !== ''; }) // effectively split after delimiter by adding it back .map(function (cert) { return cert + '-----END CERTIFICATE-----\n'; }) 

mwain解释了如何全局设置CA证书,而不是每个https请求:

有类似的问题,有内部应用程序使用内部签名的证书。 提示使用https.globalAgent并设置一个在configuration中定义并在env基础上更新的CA数组。

 const trustedCa = [ '/etc/pki/tls/certs/ca-bundle.crt', '/path/to/custom/cert.crt' ]; https.globalAgent.options.ca = []; for (const ca of trustedCa) { https.globalAgent.options.ca.push(fs.readFileSync(ca)); } 

由于您不控制应用程序,并且无法通过ca选项(通常的方式),所以您可以尝试通过设置环境variablesNODE_TLS_REJECT_UNAUTHORIZED告诉Node不要validation证书。 例如:

 $ export NODE_TLS_REJECT_UNAUTHORIZED=0 

然后运行该应用程序。

正如@ keinabel所说,当你这样做的时候,应用程序将会信任任何(欺骗,伪造,合法的)证书,从而使你面临中间人攻击。 正确和安全的解决scheme将是应用程序开发人员让您指定一个可信的CA.

我知道有两个npm模块可以处理这个问题,当你控制应用程序:

  1. https://github.com/capriza/syswide-cas (我是这个的作者)
  2. https://github.com/coolaj86/node-ssl-root-cas

node-ssl-root-cas捆绑它自己的节点根CA的副本,也可以添加自己的CA信任。 它将证书放在https全局代理上,所以它只会用于https模块,而不是纯粹的tls连接。 另外,如果使用自定义代理而不是全局代理,则需要额外的步骤。

syswide-cas从预定义的目录(例如/ etc / ssl / certs)加载证书,并使用节点内部API将它们添加到CA的受信任列表以及捆绑的根CA中。 没有必要使用ca选项,因为它会进行全局更改,自动影响所有后续的TLS调用。 如果需要,也可以从其他目录/文件添加CA. validation了与节点0.10,节点5和节点6一起工作。

由于您不控制应用程序,因此您可以创build一个封装脚本来启用syswide-cas (或node-ssl-root-cas ),然后需要使用ionic-cli脚本:

 require('syswide-cas'); // this adds your custom CAs in addition to bundled CAs require('./path/to/real/script'); // this runs the actual script 

Node.js 7.3.0添加了NODE_EXTRA_CA_CERTS环境variables,供您传递CA证书文件。 这将比使用NODE_TLS_REJECT_UNAUTHORIZED禁用证书validation更安全。

 $ export NODE_EXTRA_CA_CERTS=[your CA certificate file path]