WebSocket với SSL


115

Có thể có WebSockets với HTTPS không?

Khi chuyển sang HTTPS, WebSocket của tôi trả về lỗi bảo mật và hoạt động hoàn hảo với HTTP thông thường.

Dưới đây, một đoạn mã;

socket = new WebSocket("ws://my_www:1235"); 

thật tệ, tôi nhận ra rằng máy chủ AIR socket mà tôi đang sử dụng không an toàn, tôi phải viết lại để sử dụng flash.net.SecureSocket ...
Eric

Câu trả lời:


170

Kết nối WebSocket bắt đầu vòng đời của nó bằng cách bắt tay HTTP hoặc HTTPS. Khi trang được truy cập thông qua HTTP, bạn có thể sử dụng WS hoặc WSS (WebSocket secure: WS over TLS). Tuy nhiên, khi trang của bạn được tải qua HTTPS, bạn chỉ có thể sử dụng WSS - các trình duyệt không cho phép "hạ cấp" bảo mật.


đó là những gì tôi có nhưng tôi nhận ra rằng máy chủ AIR socket mà tôi đang sử dụng không an toàn, tôi phải viết lại để sử dụng flash.net.SecureSocket ...
Eric

Flash cũng có những vấn đề nghiêm trọng ... Bạn đang xây dựng một máy chủ WebSocket (nếu vậy, tại sao) hay bạn đang xây dựng một ứng dụng?
Peter Moskovits

1
Tôi có một máy chủ ổ cắm AIR đang chạy có.
Eric

Vậy làm thế nào để chọn WSS nếu trang không được tải bằng HTTP?
anatoly techtonik

29

Bạn không thể sử dụng WebSockets qua HTTPS, nhưng bạn có thể sử dụng WebSockets qua TLS (HTTPS là HTTP qua TLS). Chỉ cần sử dụng "wss: //" trong URI.

Tôi tin rằng phiên bản Firefox gần đây sẽ không cho phép bạn sử dụng các WebSockets không phải TLS từ một trang HTTPS, nhưng điều ngược lại sẽ không thành vấn đề.


Vậy, giải pháp là gì? Tôi có một máy chủ WS chạy qua http, tôi đã mua một SSL và trình duyệt không còn cho phép tôi kết nối với WS nữa. Tôi đã chuyển WS thành WSS: // và bây giờ nó không kết nối với WebSocket
muaaz

@muaaz máy chủ WebSocket của bạn phải đang chạy ở chế độ WSS và tốt nhất là được tải bằng các khóa / chứng chỉ SSL giống như máy chủ web của bạn đang cung cấp các trang web gốc của bạn đang cố gắng kết nối với máy chủ websocket.
kanaka

4
Cảm ơn bạn. btw, tôi vừa giải quyết nó bằng cách Proxying (sử dụng apache) yêu cầu từ wss://tới ws://. Vì vậy, tôi sử dụng wss://ws.domain.comvà apache áp dụng proxy trên đó và chuyển hướng yêu cầu nơi máy chủ WS đang chạy. ví dụ: ws://10.12.23.45:5641/server.php. và tôi biết nó là một giải pháp rất tệ - mặc dù, nó phù hợp với tôi. Tôi đánh giá cao sự giúp đỡ của bạn nếu bạn hướng dẫn tôi cấu hình apache. ví dụ: nơi để đặt .certvv cảm ơn!
muaaz

@muaaz xin lỗi, tôi không biết cấu hình apache ngoài việc tự tìm kiếm nó.
kanaka

21

1 cảnh báo bổ sung (ngoài câu trả lời của kanaka / peter): nếu bạn sử dụng WSS và chứng chỉ máy chủ không được trình duyệt chấp nhận, bạn có thể không nhận được bất kỳ hộp thoại hiển thị nào của trình duyệt (giống như nó xảy ra với các trang Web). Điều này là do WebSockets được coi là cái gọi là "nguồn phụ" và các hộp thoại chấp nhận chứng chỉ / bảo mật / bất kỳ hộp thoại nào không được hiển thị cho các nguồn phụ.


Ngay cả khi nó giống như chứng nhận được sử dụng cho HTTPS?
vekah

1
Bạn hiểu "hộp thoại hiển thị trên trình duyệt" là gì? Như alert()thế nào?
Ivan Perevezentsev

2
Các hộp thoại có nguồn gốc nguyên bản trong trình duyệt (không phải trang). Giống như "chứng chỉ này không hợp lệ, bạn có muốn tiếp tục không?"
oberstet

vậy có cách nào khắc phục được không? nếu tôi sử dụng chứng chỉ tự ký, tôi vẫn có thể sử dụng websocket chứ?
OhadR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.