1

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 直接调用?我知道如何覆盖我需要的库中的函数,但不知道这些库包含的库。

4

2 回答 2

2

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

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

tls.checkServerIdentity = 功能(主机,证书){
  返回真;
};

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

出口。测试=功能(){
  console.log(tls.checkServerIdentity()); // 真的
};
于 2013-04-05T16:04:04.547 回答
0

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

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

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

于 2013-05-03T20:20:18.447 回答