Node.js 通过TLS连接上的节点js向flash发送跨域策略

Node.js 通过TLS连接上的节点js向flash发送跨域策略,node.js,actionscript-3,flash,tls1.2,cross-domain-policy,Node.js,Actionscript 3,Flash,Tls1.2,Cross Domain Policy,我有一个客户端在flash as3中。 我有两个服务器,一个用于flash客户端的主服务器和一个套接字策略服务器 例如,我在端口843上运行套接字策略服务器,在任何端口X上运行客户端 现在,当我连接flash客户端时,使用以下方法: Security.loadPolicyFile("xmlsocket://domain.com:port"); SecureSocket.connect(ip, port); 它实际上首先连接到我的策略套接字服务器,发送策略文件请求行,然后使用我的服务器接收我

我有一个客户端在flash as3中。 我有两个服务器,一个用于flash客户端的主服务器和一个套接字策略服务器

例如,我在端口843上运行套接字策略服务器,在任何端口X上运行客户端

现在,当我连接flash客户端时,使用以下方法:

 Security.loadPolicyFile("xmlsocket://domain.com:port");
 SecureSocket.connect(ip, port);
它实际上首先连接到我的策略套接字服务器,发送策略文件请求行,然后使用我的服务器接收我正在发送的策略文件请求行,如下所示:

 tls.createServer(options, function(sock) {
    sock.on('data', function(data) {
            console.log('Data receveid: '.cyan + data + ' from ' + sock.remoteAddress);
            if (data == "<policy-file-request/>\0") {
                    sock.write('<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-access-from domain="*"></cross-domain-policy
                    console.log('Sent policy file to: '.green + sock.remoteAddress);
            }
 ...
tls.createServer(选项、函数(sock){
sock.on('data',函数(data){
console.log('Data receiveId:'.cyan+数据+'from'+sock.remoteAddress));
如果(数据==“\0”){

sock.write(“好的,我终于让它工作了。首先,我想从我的客户端到我的游戏建立一个SSL连接

  • 在Flash IDE中本地尝试也不错
  • 然而,在FlashDebugguer中或从网站上执行该操作是不起作用的 因为它试图访问套接字策略服务器(这是一个 从adobe注册的端口(843端口)
所以我需要一个策略套接字服务器来处理这个端口,并且在adobe网站上找到了一些用python和perl编写的。忘记它们,在这种情况下它们不会工作

因为我正在尝试使用SSL访问服务器,所以我还需要一个SSL策略服务器。
因为网络上没有SSL策略服务器,所以我编写了一个简单的服务器:

var tls = require('tls');
var fs = require('fs');

var options = {
  key: fs.readFileSync('/etc/ssl/private/yourserver.key'),
  cert: fs.readFileSync('/etc/ssl/certs/yourserver.crt'),
};

var HOST = 'YOURSERVERIP';
var PORT = 843;

tls.createServer(options, function(sock) {
    sock.on('data', function(data) {
            console.log('Policy Server Request: ' + data);
            if (data.indexOf('policy') !== -1) {
                    console.log("Policy Server: sending regulation file");
                    sock.write('<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"><!-- Policy file for xmlsocket://MYDOMAIN.com --><cross-domain-policy><allow-access-from domain="*" to-ports="*" /><allow-access-from domain="*" to-ports="1-65535" /><allow-access-from domain="MYDOMAIN.com" to-ports="MYGAMEPORT" /><allow-access-from domain="MYIP" to-ports="*" /></cross-domain-policy>\0');
            } else {
                    console.log("Policy Server: unknown request");
            }

    });
    sock.on('clientError', function(exception) {
            console.log('' + data);
    });
    sock.on('close', function(data) {
            console.log('CONNECTION CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
    });
    sock.on('error', function(err) {
            console.log('\n' + HOST +':'+ err);
    });
}).listen(PORT, HOST);

console.log('\nPolicy Server listening on ' + HOST +':'+ PORT);
var-tls=require('tls');
var fs=需要('fs');
变量选项={
key:fs.readFileSync('/etc/ssl/private/yourserver.key'),
cert:fs.readFileSync('/etc/ssl/certs/yourserver.crt'),
};
var HOST='YOURSERVERIP';
var端口=843;
tls.createServer(选项、函数(sock){
sock.on('data',函数(data){
log('策略服务器请求:'+数据);
if(data.indexOf('policy')!=-1){
log(“策略服务器:发送规则文件”);
sock.write('\0');
}否则{
log(“策略服务器:未知请求”);
}
});
sock.on('clientError',函数(异常){
控制台日志(“”+数据);
});
sock.on('close',函数(数据){
console.log('连接关闭:'+sock.remoteAddress+'+sock.remotePort);
});
sock.on('error',函数(err){
console.log('\n'+HOST+':'+err);
});
}).侦听(端口、主机);
console.log('\n在'+HOST+'上侦听的策略服务器:'+PORT);
我在allow access domain表单中疯了,因为我有一些安全沙盒违规行为,并且减少了一个,所以我把它都放在这里了。我稍后会清理这个

如您所见,我必须在发送策略的末尾添加一个
\0
,否则Flash将不接受它


在这上面浪费了两天时间。我仍然不明白为什么Adobe会让flash和世界之间的联系变得如此困难。在编程套接字时,从未在其他地方看到过这种策略。

我不使用Javascript套接字,但你应该检查收到的
sock.write
的内容。在编写/发送之后,它看起来仍然正确吗?或者它被解析/剥离了?无论如何,我希望它想要的是字节值而不是文本。将文本放在跨域文本文件中,并在十六进制编辑器中打开它(可以使用在线编辑器),这些文本显示的字节是您应该发送的。例如“hello”是字母的字节值
0x68 0x65 0x6C 0x6C 0x6C 0x6F
。希望有人能尽快回答你…我不知道如何检查,因为flash会自动发送跨域检查,并以某种方式接收它我无法控制…我会尝试使用wiresharkI了解flash会自动执行跨域检查。我是说jus当你使用
sock时,请不要检查文本的格式是否仍与预期一致。请编写
。你可以通过套接字将文本写入你控制的内容(如JS函数或网页中的文本框等)进行检查。无论如何,它会自动关闭,因为出现问题。请尝试阅读本文以获取提示…很高兴它已排序,感谢您共享有用的解决方案。是的lash安全性可能会让人恼火和恼火,这是一种防御措施。此外,当Flash在视频播放中排名第一时(有时通过插座等),他们不得不通过显示其难以连接和窃取数据来取悦工作室和内容制作者。现在开始使用策略文件系统。问题是,对于“我”或“你”如何向TLS套接字策略服务器发出加密Security.loadPolicyFile(“xmlsocket://“+host”)请求?