重写低级node.js模块
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属性 节点模块重写低级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的规
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
}
});