【问题标题】:Overriding a low level node.js module覆盖低级 node.js 模块
【发布时间】:2023-03-29 06:59:02
【问题描述】:

Amazon S3 允许静态网站托管,但要求存储桶名称必须与您的域名匹配。这意味着您的存储桶名称将类似于:mydomain.com。 Amazon S3 还为 *.s3.amazonaws.com 提供通配符 SSL 证书。根据 TLS 的规则,这意味着 com.s3.amazonaws.com 被证书覆盖,但 mybucket.com.s3.amazonaws.com 不是。连接到 *.com.s3.amazonaws.com 的节点应用程序,例如 Knox,应该确实能够信任该证书,即使它违反了 TLS 规则,因为 knox 库是一个“封闭系统”:它只曾经连接到亚马逊资产。

Node模块https依赖tls.js,而tls.js有这个功能:

function checkServerIdentity(host, cert) {
...
// "The client SHOULD NOT attempt to match a presented identifier in
// which the wildcard character comprises a label other than the
// left-most label (e.g., do not match bar.*.example.net)."
// RFC6125
if (!wildcards && /*/.test(host) || /[.*].**/.test(host) ||
    /*/.test(host) && !/*.*..+..+/.test(host)) {
   return /$./;
 }

这将正确返回“证书不匹配”错误。上层的 Knox 模块是否可以覆盖 checkServerIdentity 函数,该函数向下几层且不被 Knox 直接调用?我知道如何覆盖我需要的库中的函数,但不知道这些库包含的库。

【问题讨论】:

    标签: node.js ssl amazon-s3


    【解决方案1】:

    模块有一个全局缓存,这意味着您覆盖的任何功能都将针对所有其他模块进行修改。我认为您可以自己包含tls 并修补checkServerIdentity

    // main.js var tls = 要求('tls'), mod = require('./mod.js'); tls.checkServerIdentity = 功能(主机,证书){ 返回真; }; mod.test(); // mod.js var tls = 要求('tls'); 出口。测试=功能(){ console.log(tls.checkServerIdentity()); // 真的 };

    【讨论】:

    • 要求澄清:你的意思是说我在我的应用程序中包含 tls 并覆盖该函数,也会在全局缓存中覆盖它,或者你是说通过你的伪代码不会修改全局缓存?
    • 是:覆盖该函数将在全局缓存中覆盖它。我的示例显示在 main.js 中更改 tls 也会在 mod.js 中更改它
    • 谢谢,但如果全局缓存中有我的 Amazon 特定覆盖,则覆盖会为其他节点应用程序带来安全问题。
    • 这不会更改 tls.connect 使用的 checkServerIdentity 版本,因为它引用的是本地函数名称,而不是导出的变量。
    【解决方案2】:

    如果您不想更改全局模块对象(根据您对 Nik 答案的评论),也许您可​​以使用 rewire 模块。我想像这样做:

      var knoxModule = rewire("./node_modules/knox/somefile.js");
      knoxModule.__set__("tls", {
          checkServerIdentity: function (host, cert) {
              // some code
          }
      });
    

    不过我从来没有使用过它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多