2013-06-07 37 views
29

Tôi có một tập tin máy chủ ratchet trò chuyệnphp ratchet websocket SSL kết nối?

use Ratchet\Server\IoServer; 
use Ratchet\WebSocket\WsServer; 
use MyAppChat\Chat; 
require dirname(__DIR__) . '/vendor/autoload.php'; 
$server = IoServer::factory(
    new WsServer(
     new Chat() 
    ) 
    , 26666 
); 
$server->run(); 

tôi sử dụng WebSocket để kết nối với ws và nó hoạt động tốt

if ("WebSocket" in window) { 
    var ws = new WebSocket("ws://ratchet.mydomain.org:8888"); 
    ws.onopen = function() { 
     // Web Socket is connected. You can send data by send() method. 
     ws.send("message to send"); 
    }; 
    ws.onmessage = function (evt) { 
     var received_msg = evt.data; 
    }; 
    ws.onclose = function() { 
     // websocket is closed. 
    }; 
} else { 
    // the browser doesn't support WebSocket. 
} 

Tôi muốn kết nối an toàn, vì vậy tôi cố gắng kết nối với SSL nhưng không hoạt động .

if ("WebSocket" in window) { 
    var ws = new WebSocket("wss://ratchet.mydomain.org:8888"); 
    ws.onopen = function() { 
     // Web Socket is connected. You can send data by send() method. 
     ws.send("message to send"); 
    }; 
    ws.onmessage = function (evt) { 
     var received_msg = evt.data; 
    }; 
    ws.onclose = function() { 
     // websocket is closed. 
    }; 
} else { 
    // the browser doesn't support WebSocket. 
} 

Câu hỏi của tôi là làm thế nào để kết nối WebSocket với kết nối SSL

Bất kỳ ý tưởng?

Trả lời

25

Nếu bạn đang sử dụng máy chủ web Apache (2.4 trở lên), hãy bật các mô-đun này trong tệp httpd.conf:

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

Thêm cài đặt này để httpd của bạn.conf tập tin

ProxyPass /wss2/ ws://ratchet.mydomain.org:8888/ 

Sử dụng URL này trong cuộc gọi JavasScript của bạn khi bạn muốn có một kết nối WSS:

var ws = new WebSocket("wss://ratchet.mydomain.org/wss2/NNN"); 

Restart Apache web server và đảm bảo rằng nhân viên Ratchet của bạn (kết nối ổ cắm web) đang mở trước khi áp dụng các thiết lập (cổng máy chủ telnet).

+1

Tốt, công trình này, nhưng một câu hỏi: tại sao "/ NNN" ở cuối? Cảm ơn! – amcastror

+1

Tham khảo các tham số URL tiếp theo của chúng tôi (ví dụ:/wss2/param1/param2 ...) có thể được hệ thống của chúng tôi sử dụng để xác định mục đích yêu cầu. Bạn có thể loại bỏ nó nếu không cần thiết, nhưng xin lưu ý rằng bạn phải có cùng thông số url khớp giống nhau (trong trường hợp này là '/ wss2 /') để máy chủ có thể khớp/bắt yêu cầu và chuyển tiếp nó tới miền/cổng tùy chỉnh. – webcoder

+0

Điều này thực sự làm việc trên APache 2.4 với cboden/ratchet, thx rất nhiều – mitchken

8

Vấn đề là React (mà Ratchet được xây dựng trên) không hỗ trợ kết nối SSL trực tiếp. Xem này issue.

Có cách giải quyết đơn giản. Sử dụng stunnel với một cấu hình như:

[websockets] 
accept = 8443 
connect = 8888 

Stunnel sẽ xử lý lưu lượng SSL trên cổng 8443 và cổng chúng lên máy chủ WebSocket của bạn.

+0

Không nginx hỗ trợ proxy_passing WebSocket, tôi sẽ đề nghị sử dụng nó. Bằng cách này chúng tôi có thể tạo điều kiện phục vụ wss trên cổng 443 do đó không bị chặn bởi hầu hết các tường lửa của công ty. –

7

Tôi tìm thấy câu trả lời này trên Ratchet's google group bởi Chris Boden:

Giải pháp tốt nhất là nên sử dụng Nginx như máy chủ web của bạn. Yêu cầu Nginx lắng nghe cổng 80 cho các kết nối đến và xử lý kết nối SSL của bạn. Nginx sẽ chuyển tiếp các kết nối đến PHP-FPM cho trang web thông thường của bạn và nếu phát hiện kết nối là kết nối WebSocket , hãy kết nối với ứng dụng Ratchet đang chạy của bạn trên cổng do bạn chọn. javascript của bạn sau đó có thể kết nối thông qua WSS: //mydomain.org

Đây là một cách khác để sử dụng stunnel nếu ứng dụng của bạn sẽ được phân phối bằng nginx.

+0

Cảm ơn câu trả lời của bạn, tôi đã thực hiện công việc này: D, bây giờ tôi sẽ làm việc với scapy trong python cho địa chỉ ip nguồn giả mạo nhưng thực sự làm việc chăm chỉ: (bạn có thể giúp tôi? – vietnguyen09

+2

Có mẫu cấu hình nginx cho thủ thuật này không? – temuri

+0

@temuri yea Tôi đã tìm thấy một gist đôi khi trước đây với cấu hình để làm cho nó hoạt động. Đáng buồn là tôi không thể tìm thấy nó bây giờ – Songo

2

Apache cũng làm việc cho tôi, chỉ cần thêm vào conf miền:

ProxyPass /wss/ wss://127.0.0.1:8888/ 

Nạp lại apache và sau đó nó nhập khẩu để thiết lập WSS ở phía khách hàng để bao gồm /WSS/ vị trí

wss://127.0.0.1/wss/ 
3

Nếu bạn đang sử dụng Nginx, chỉ cần viết này trong khối máy chủ SSL của bạn:

location /services/myservice { 
    # switch off logging 
    access_log off; 

    # redirect all HTTP traffic to localhost 
    proxy_pass http://localhost:1234; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    # WebSocket support (nginx 1.4) 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 

    # Path rewriting 
    rewrite /services/myservice/(.*) /$1 break; 
    proxy_redirect off; 

    # timeout extension, possibly keep this short if using a ping strategy 
    proxy_read_timeout 99999s; 
} 

này sẽ nâng cấp bất kỳ wss://yoursite.com/services/myservice cuộc gọi đến một ổ cắm chạy trên cổng 1234. Chỉ cần chắc chắn rằng bạn nhớ đừng rời cảng 1234 mở ra thế giới.

1

Nếu bạn đang sử dụng Windows IIS, hãy chắc chắn rằng bạn đã cấu hình nó cho HTTPS (Tôi đang sử dụng tự ký giấy chứng nhận), sau đó cài đặt reverse proxy:

ghi đè URL: https://www.iis.net/downloads/microsoft/url-rewrite và ARR 3.0: https://www.iis.net/downloads/microsoft/application-request-routing

Bạn cũng cần phải kích hoạt hỗ trợ WebSockets trong IIS: enter image description here

tạo thư mục (ví dụ myproxyfolder) cho URL viết lại, vào thư mục này tạo file web.config với nội dung:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="WebSocketProxy" stopProcessing="true"> 
        <match url="(.*)" /> 
        <action type="Rewrite" url="http://127.0.0.1:8080" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

và thay đổi "http://127.0.0.1:8080" thành dịch vụ websocket (Tôi đang sử dụng Ratched for PHP on WIN).

Về phía khách hàng trong javascript, sử dụng an toàn WebSockets WSS: // giao thức, như:

mysock = new WebSocket('wss://127.0.0.1/myproxyfolder'); 
... 
1

Một vài ngày trước, tôi đang tìm kiếm câu trả lời của câu hỏi này và tôi thấy điều này trong các vấn đề Github Ratchet : https://github.com/ratchetphp/Ratchet/issues/489

Câu trả lời cuối cùng, trả lời bằng cách heidji, nói điều này:

tôi chỉ thêm nhận xét này cho người mới như tôi, những người cần một hướng dẫn nhanh cách imp lement SSL: Qua các tài liệu ReactPHP bạn chỉ cần để xây dựng các SecureServer đề cập theo cách như vậy:
$webSock = new React\Socket\Server('0.0.0.0:8443', $loop);
$webSock = new React\Socket\SecureServer($webSock, $loop, ['local_cert' => '/etc/ssl/key.pem', 'allow_self_signed' => true, 'verify_peer' => false]);
và sau đó tiêm vào IoServer như đã đề cập bởi cboden trên

Vì vậy, có vẻ như rằng bây giờ có là một cách để triển khai máy chủ websocket an toàn với Ratchet mà không cần proxy HTTPS.

Ở đây bạn có tài liệu hướng dẫn lớp SecureServer: https://github.com/reactphp/socket#secureserver

Các vấn đề liên quan