2013-04-05 47 views
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.js模块

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

回答

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 
}; 
+0

要求澄清:你的意思是说,通过我在我的应用程序中包括tls并覆盖函数,还将覆盖它在全局缓存中,或者你是否说通过你的伪代码做它不会修改全局缓存? – regretoverflow 2013-04-05 19:10:12

+1

是:覆盖该函数将覆盖它在全局缓存中。我的例子显示,在main.js中更改tls也会在mod.js中更改它 – 2013-04-05 20:46:58

+0

谢谢,但如果全局缓存中有我的亚马逊特定覆盖,则覆盖会为其他节点应用程序带来安全问题。 – regretoverflow 2013-04-08 21:03:54

0

如果你不想让(在聂的回答每您的评论)全球模块对象的变化,也许你可以使用rewire模块。我想这样做是这样的:

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

虽然我从来没有使用它。