覆盖低级node.js模块

时间:2013-04-05 15:33:40

标签: node.js ssl amazon-s3

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库是一个“封闭系统”:它只连接到亚马逊物业。

节点模块https依赖于tls.jstls.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直接调用的?我知道如何覆盖我需要的库中的函数,但不知道这些库包含的库。

2 个答案:

答案 0 :(得分:2)

模块有一个全局缓存,这意味着您将覆盖的任何函数都将被修改为所有其他模块。我认为您可以自己添加tls并修补checkServerIdentity

// main.js
var tls = require('tls'),
    mod = require('./mod.js');

tls.checkServerIdentity = function (host, cert) {
  return true;
};

mod.test();
// mod.js
var tls = require('tls');

exports.test = function () {
  console.log(tls.checkServerIdentity()); // true
};

答案 1 :(得分:0)

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

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

我从未使用它。