Не удалось установить соединение с WebSocket: отменено подтверждение доступа к WebSocket
Недавно я установил экземпляр EC2 (в VPC без балансировки нагрузки), и, по общему признанию, конфигурация немного нечетна, но это то, что требуется для используемого веб-приложения.
Веб-сервер (в Haskell) работает на порту 4433 (стандартные порты зарезервированы для экземпляра Apache) и принимает пакеты UDP, транслируемые из другой системы. У меня много открытых портов (только во время тестирования), как показано здесь (из групп безопасности):
Custom TCP Rule 4433 tcp 0.0.0.0/0 ✔
Custom TCP Rule 8080 tcp 0.0.0.0/0 ✔
SSH 22 tcp 0.0.0.0/0 ✔
HTTP 80 tcp 0.0.0.0/0 ✔
HTTPS 443 tcp 0.0.0.0/0 ✔
Custom UDP Rule 30090 udp 0.0.0.0/0 ✔
Custom UDP Rule 30089 udp 0.0.0.0/0 ✔
JavaScript для сокета TCP делает запрос на настройку сокета на этом же порту (с использованием URL-адреса, присвоенного общедоступному IP-адресу AWS), и здесь запрос возвращает ошибку:
Соединение с WebSocket с 'wss://[URL]: 4433/projects/socket' не удалось: сообщение подтверждения открытия WebSocket было отменено.
Привязка сокета к 0.0.0.0 приводит к той же ошибке.
Чтобы запустить веб-сервер Haskell, мне пришлось ссылаться на внутренний IP-адрес, предоставляемый AWS, поскольку он не будет работать при ссылке на публичный IP-адрес, предоставляемый гибким IP-сервисом. Думаю, в этом проблема возникла, я изменил запрос на сокет на это...
wss://[internal ip]:4433/projects/socket
Это изменяет ошибку:
Соединение с WebSocket с 'wss://[внутренний IP]: 4433/projects/socket' не удалось: ошибка в установлении соединения: net:: ERR_CONNECTION_REFUSED
Эта ошибка имеет смысл для меня, поскольку внутренний IP недоступен для внешнего мира.
Все, что я прочитал в websockets на AWS, включает ELB (Elastic Load Balancer), и я не нуждаюсь ни в одном из них. Я пробовал все вещи во всех опубликованных в настоящее время ответах (некоторые из вопросов даже не получили ответов) на SO безрезультатно. Я также установил случай поддержки с Amazon (почти 24 часа назад), который не получил ответа.
Дополнительная информация
Переход на http://[URL]:4433/projects/socket
дает "Доступный WebSocket", где URL-адрес тот, который мы хотим использовать, а также Public DNS, предоставленный AWS.
Запуск netstat -plunt
показывает следующее:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:8080 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:4433 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
udp 0 0 [internal IP]:30089 0.0.0.0:* -
udp 0 0 0.0.0.0:30090 0.0.0.0:* -
udp 0 0 0.0.0.0:11950 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp6 0 0 :::38450 :::* -
У кого-то была аналогичная проблема с websockets на AWS? Если да, то как вы решили проблему?
Ответы
Ответ 1
Было обнаружено несоответствие SSL-сертификата между сервером Haskell и сервером Apache.
Сервер Haskell пришлось перестроить с информацией о новых сертификатах для экземпляра. Дальнейшее усложнение этого, надлежащая библиотека SSL (libssl0.9.8 libssl-dev
) не была установлена на экземпляр EC2, что вызывало у меня проблемы во время перестройки сервера Haskell. Знание экземпляра EC2 - это "пустое полотно", которое делает недостаток этой установки моей ошибкой.
Как только я установил libssl
, я смог перестроить сервер Haskell, указав на новые сертификаты. После того, как сертификаты "сопоставлены", проблема с веб-сайтом исчезла.
Чтобы повторить, наша уникальная ситуация. У нас есть сервер Apache (порты 80 и 443) и сервер Haskell (порты 8080 и 4433), которые обмениваются данными друг с другом, выполняя операцию pub-sub через websockets. Несоответствие сертификата между двумя серверами (неважно, какой тип, может быть, несколько экземпляров Apache) вызвал предупреждение SSL. Любое предупреждение от SSL будет срывать любую попытку установить или поддерживать websocket (отсюда сообщение с отменой рукопожатия).
fooobar.com/questions/331282/... предоставил некоторые подсказки, которые оказали огромную помощь в ходе этого процесса. Более конкретно это предупреждение -
Ключом к проблеме является следующее: Если ваш SSL-сертификат вызывает предупреждение любого типа, wss://соединения WebSocket будут немедленно терпеть неудачу, и нет никакого канонического способа обнаружить это.
Ответ 2
Я столкнулся с этой ошибкой при использовании веб-папок из веб-рабочего на основе blob из URL-адреса файла://. Я подозреваю, что работа на веб-сервере может это исправить; Я решил это, отключив SSL во время отладки.