【问题标题】:npm add root CAnpm 添加根 CA
【发布时间】:2014-07-10 09:54:44
【问题描述】:

我正在寻找一种将自定义 CA 添加到 NPM 的方法,以便我可以使用所述证书(内部 git 服务器)从某个位置下载,而无需使用所有 CA 检查

npm config set strict-ssl false

有没有办法实现这个? (如果没有:是否已经存在缺陷?)

【问题讨论】:

    标签: npm ca


    【解决方案1】:

    您可以将 npm 指向 cafile

    npm config set cafile /path/to/cert.pem
    

    您也可以直接配置ca 字符串。

    npm config set ca "cert string"
    

    ca 也可以是证书字符串数组。在你的.npmrc:

    ca[]="cert 1 base64 string"
    ca[]="cert 2 base64 string"
    

    上面的npm config 命令会将相关配置项保存到您的~/.npmrc 文件中:

    cafile=/path/to/cert.pem
    

    注意:这些 CA 设置将覆盖 npm 使用的默认“真实世界”证书颁发机构查找。如果您尝试通过 https 使用任何未经您的 CA 证书签名的公共 npm 注册表,您将收到错误。

    如果您需要同时支持公共 https npm 注册表以及您自己的注册表,您可以使用 curl's Mozilla based CA bundle 并将您的 CA 证书附加到 cacert.pem 文件中:

    curl https://curl.haxx.se/ca/cacert.pem > ~/.npm.certs.pem
    cat my-ca-cert.pem >> ~/.npm.certs.pem
    npm config set cafile ~/.npm.certs.pem
    

    不幸的是,npm 的 CA 包不可编辑,因为它在 source code 中提供(感谢 tomekwi)但 nitzel has provided a generic Node.js method 通过 NODE_EXTRA_CA_CERTS 环境变量附加证书。

    RHEL 注意:如果您碰巧使用的是基于 RHEL 的发行版和 RHEL 打包的 nodejs/npm,您可以使用标准的 update-ca-trust method 作为 RedHat 指向他们的包在系统 CA 上。

    【讨论】:

    • 没有随节点分发的捆绑包 - 但源中似乎有它们的列表:github.com/joyent/node/blob/master/src/node_root_certs.h
    • 不推荐使用基于 github 的 url。新网址现在是:curl.haxx.se/ca/cacert.pem
    • 试试NODE_DEBUG=tls,https,http npm -ddd command检查你的http连接是否有CA设置以及TLS握手在做什么
    • @Matt 我正在使用来自%jdk%/%jre%/lib/securitycacertsJava。它在.npmrc 中显示正确的路径。关于npm ERR! fatal: unable to access <URL>: SSL certificate problem: unable to get local issuer certificate 的错误仍然存​​在。关于这个如何解决它的任何想法??
    • @JimitPatel java 有自己的证书密钥库格式。证书需要exported with keytool 才能在 java 之外使用。
    【解决方案2】:

    如果Matts Answer 没有帮助您:

    $env:NODE_EXTRA_CA_CERTS=path\to\certificate.pem; npm install 在 Windows Powershell 中为我工作。


    对于 DOS/cmd(由 cmets 中的Marc 指出)

    set NODE_EXTRA_CA_CERTS=C:\\path\\to\\certificate.pem
    npm install
    

    【讨论】:

    • 你是如何用驱动器指定windows路径的? /path/to 只能在 Linux 中运行...
    • Gottit: set NODE_EXTRA_CA_CERTS=C:\\bcp\\cafile.pem(在 DOS 中)
    • @Marc PowerShell 接受 /\(并使用 ` 而不是 \ 来转义字符)在中转义 `\ 真是太难了降价._.
    • 我是否遗漏了什么,或者这个答案不是比公认的好得多吗?我不想“覆盖”默认设置,而且听起来也不像原来的问题。我只想将一个证书添加到信任库(我公司的 MITM 证书)。
    • 在 Linux / Unix / OSX 中:export NODE_EXTRA_CA_CERTS=/path/to/trusted/CA.pemcredit