重写低级node.js模块

重写低级node.js模块,node.js,ssl,amazon-s3,Node.js,Ssl,Amazon S3,AmazonS3允许静态网站托管,但要求bucket名称必须与您的域名匹配。这意味着您的bucket名称将类似于:mydomain.com。Amazon S3还为*.S3.amazonaws.com提供通配符SSL证书。根据TLS的规则,这意味着com.s3.amazonaws.com包含在证书中,而mybucket.com.s3.amazonaws.com不包含在证书中。节点应用程序(如连接到*.com.s3.amazonaws.com的应用程序)应该真正能够信任该证书,即使它违反了TLS的规

AmazonS3允许静态网站托管,但要求bucket名称必须与您的域名匹配。这意味着您的bucket名称将类似于:mydomain.com。Amazon S3还为*.S3.amazonaws.com提供通配符SSL证书。根据TLS的规则,这意味着com.s3.amazonaws.com包含在证书中,而mybucket.com.s3.amazonaws.com不包含在证书中。节点应用程序(如连接到*.com.s3.amazonaws.com的应用程序)应该真正能够信任该证书,即使它违反了TLS的规则,因为knox库是一个“封闭系统”:它只连接到Amazon属性

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

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

// main.js var tls = require('tls'), mod = require('./mod.js'); tls.checkServerIdentity = function (host, cert) { return true; }; mod.test(); //main.js var tls=需要('tls'), mod=require('./mod.js'); tls.checkServerIdentity=函数(主机、证书){ 返回true; }; mod.test(); //mod.js var tls=需要('tls'); exports.test=函数(){ console.log(tls.checkServerIdentity());//true };
如果您不想更改全局模块对象(根据您对Nik回答的评论),也许您可以使用该模块。我想象这样做:

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

但我从未使用过它。

要求澄清:您的意思是说,通过在我的应用程序中包含tls并重写函数,也会在全局缓存中重写它,还是说通过伪代码执行该操作不会修改全局缓存?是:重写函数会在全局缓存中重写它。我的示例显示,更改main.js中的tls也会更改mod.js中的tls谢谢,但是如果全局缓存中包含我的Amazon特定覆盖,则覆盖会为其他节点应用程序带来安全问题。这不会更改
tls.connect
使用的checkServerIdentity版本,因为它引用了本地函数名,不是导出的变量。
  var knoxModule = rewire("./node_modules/knox/somefile.js");
  knoxModule.__set__("tls", {
      checkServerIdentity: function (host, cert) {
          // some code
      }
  });