通过TLS连接上的节点js将跨域策略发送到闪存

时间:2016-03-06 03:39:07

标签: node.js actionscript-3 flash tls1.2 cross-domain-policy

我有一个flash in3的客户端。 我有2个服务器,一个主服务器用于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);
            }
 ...

之后,连接自动关闭。然后它尝试连接到我的真实服务器并再次向服务器发送策略文件请求行,然后关闭连接。我真的不知道从现在起该怎么做我一直在尝试所有的日子并在网上搜索。任何人都知道我错过了什么?

1 个答案:

答案 0 :(得分:2)

好的,我终于开始工作了。首先,我想要从我的客户端到我的游戏的SSL连接。

  • 在Flash IDE中本地试用它很好,
  • 但是,在Flash调试器或网站上进行此操作并不起作用 因为它试图访问套接字策略服务器(这是一个 来自adobe的注册港口,港口843)。

所以我需要一个策略套接字服务器来处理该端口,并在adobe网站上找到一些用python和perl编写的。忘了他们,他们在这种情况下不会工作。

因为我试图访问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);

我在允许访问域表单中疯了,因为我有一个安全沙箱违规,减少了一个,所以我把它全部。我稍后会清理它。

正如您所见,我必须在发送政策时添加\0,否则Flash不会接受

两天浪费在这上面。而且我仍然不明白为什么Adobe会在闪存和世界之间建立如此困难的连接。在编程套接字时,从未在别处看到过这种策略。