2013-04-05 76 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 
     } 
    }); 

雖然我從來沒有使用它。