2013-02-20 1 views
1

저는 이틀을 보냈습니다. 누군가가되기를 바랍니다.apache ssl (443) node.js ssl (8081). 클라이언트가 socket.io.js를 찾을 수 없습니다.

나는, 나는 socket.io/socket.io을 포함하도록 노력하고 내가 클라이언트에서 포트 8081

에 SSL을 실행하는 Node.js를 서버가 포트 443 에 SSL을 실행하는 아파치 서버가 .js 파일은 다음과 같습니다.

<script src="https://my_url.com:8081/socket.io/socket.io.js"></script> 

404 (찾을 수 없음)가 표시되지 않습니다. 크롬 자바 스크립트 콘솔에서 Status = (failed) 및 Type = undefined를 얻습니다. 내가 찾은 제안을 시도했다. (src = "localhost .."등을 사용하지만 둘 중 하나는 작동하지 않는다.)

내 http 버전에서 작동합니다. 다음과 같은 파일을 포함합니다.

<script src="http://my_url.com:8080/socket.io/socket.io.js"></script> 

SSL 버전이 작동하지 않는 이유를 잘 모르겠습니다. 어떤 아이디어? 미리 감사드립니다 !! 당신이 protocoll 기원이 동일한 원본 정책 다음과 동일하지 않은 변경하는 경우

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

: 내가 추측 귀하의 코멘트에서

+0

당신은 시스템의 아키텍처에 대해 더 자세히 설명 할 수 있습니까? 왜 두 서버에서 ssl을 실행하고 누가 스크립트를 제공하는지 이해할 수 없습니다. – pfried

+0

로그인을 위해 PHP 페이지를 제공하기 위해 아파치를 사용하고 있습니다. 모든 스크립트 파일 등이 바로 socket.io.js입니다. node.js ssl을 만들지 않으면 "http://my_url.com:8080/socket.io/socket.io.js에서 안전하지 않은 콘텐츠가 제공되었습니다"라는 경고 메시지가 나타납니다. – Jen

+0

노드 https 서버를 작동시킬 수 없습니다. 그러나 또 다른 해결책을 찾았습니다. Amazon Load Balancer를 사용하여 SSL을 종료하고 http를 노드 서버로 보냅니다. 그것은 위대한 일을하고 있습니다. SSL Apache 트래픽에 대해 동일한 작업을 수행합니다. 참고 -이 경로를 사용하는 경우 노드 트래픽에로드 균형 조정기의 TCP (SSL) 및 TCP 옵션을 사용해야합니다. – Jen

답변

0

당신은 CORS의 문제가있다. 이를 위해 헤더를 포함시켜야합니다.

https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript?redirectlocale=en-US&redirectslug=Same_origin_policy_for_JavaScript

안전하지 않은 내용에 대한 경고는 문제의 원인이 무엇인지 힌트 : 당신은 스크립트의 근원 아닌 스크립트를 통해 원점에 액세스하려고합니다. 유해한 스크립트가 페이지에 주입되는 누출을 제공 할 수 있으므로 보안 문제입니다.

+0

브라우저는 이것을 매우 다르게 처리합니다. 일부는 스크립트를로드하지만 실행하지 않습니다. 일부는 OPTIONS 요청을 사이트에 보내고 스크립트로드를 거부합니다. – pfried

+0

이 문제를 조사했습니다.하지만 내 http 버전이 작동하는 이유를 이해할 수 없습니다. . 이것을 사용할 때 (내 아파치가 80 번 포트에서, node.js가 8080 번 포트에서 실행될 때), 작동한다. https에 대한 출처 정책 규칙이 다른가요? – Jen

+0

node.js ssl 설정에 문제가있는 것 같습니다. 방금 브라우저에서 직접 링크로 이동하여 보안 오류에 대한 SSL 오류가 발생했지만 socket.io.js 파일이 안전하지 않은 것으로 표시됩니다. – Jen

0

ProxyPass를 Localhost로 설정하지 마십시오! 그건 효과가 없어!

아파치 configuraton에서이 작업을 수행 : 이제

<VirtualHost *:443> 
    ServerName domain.com 
    SSLProxyEngine On 
    RequestHeader set Front-End-Https "On" 
    ProxyPass/https://domain.com:3000/ retry=1 acquire=3000 timeout=600 Keepalive=On 
    ProxyPassReverse/https://domain.com:3000/ 

    SSLEngine on 
    SSLCertificateKeyFile /etc/ssl/private/domain.com.key 
    SSLCertificateFile  /etc/ssl/certs/domain.com.crt 
    SSLCertificateChainFile /etc/ssl/certs/chaincert.crt 
</VirtualHost> 

을 Nodejs도 가질 수 SSL : 나를 위해

var socket = io.connect('https://domain.com:3000', { path: '/socket.io', 'flash policy port': 3000 }); 

:

var express = require('express'); 
var connect = require('connect'); 
var app = express(); 
var fs = require('fs'); 

var ssl_options = { 
    key: fs.readFileSync('/etc/ssl/private/domain.com.key'), 
    cert: fs.readFileSync('/etc/ssl/certs/domain.com.crt'), 
    ca: fs.readFileSync('/etc/ssl/certs/domain.com.ca') 
}; 

var server = require('https').createServer(ssl_options, app); 
var port = process.env.PORT || 3000; 

var io = require('socket.io')(server); 

server.listen(port, function(err) { 
    console.log(colors.green('https server running on port ' + port)); 
}); 

그리고 클라이언트에이 작업을 수행 ,이 잘 작동합니다!