2013-04-05 3 views
1

Amazon S3 позволяет использовать статический хостинг веб-сайтов, но с требованием, чтобы имя ведра соответствовало вашему доменному имени. Это означает, что ваше имя в виде ковша будет выглядеть так: mydomain.com. Amazon S3 также предоставляет SSL-сертификат подстановки для * .s3.amazonaws.com. По правилам TLS это означает, что com.s3.amazonaws.com IS покрыт сертификатом, но mybucket.com.s3.amazonaws.com - нет. Приложения Node, такие как Knox, которые подключаются к * .com.s3.amazonaws.com, действительно должны иметь возможность доверять этому сертификату, даже если он нарушает правила TLS, поскольку библиотека knox является «закрытой системой»: она только когда-либо соединяется к собственности Amazon.Переопределение модуля node.js низкого уровня

Модуль 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? Я знаю, как переопределить функцию в требуемой библиотеке, но не библиотеки, которые включены в эти библиотеки.

ответ

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

+1

Да: переопределение функции переопределит ее в глобальном кеше. Мой пример показывает, что изменение tls в main.js также меняет его в mod.js –

+0

Спасибо, но переопределение откроет проблемы с безопасностью для других приложений узла, если в глобальном кеше была моя специфическая переопределенность Amazon. – regretoverflow

0

Если вы не хотите вносить изменения в глобальных объектов модуля (за свой комментарий на ответ для Nik), может быть, вы могли бы использовать rewire модуль. Я представляю себе что-то вроде этого:

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

Я никогда не работал с ним.

Смежные вопросы