2010-11-30 1 views
2

У меня есть интересная проблема безопасности в сети, и я не могу найти лучший способ атаковать.Как обеспечить безопасное соединение между брандмауэрами с использованием ненадежного хоста?

мне нужно предоставить способ, чтобы позволить двум компьютерам (А и В), которые находятся за брандмауэрами, чтобы создать безопасное соединение друг с другом, используя только общий «брокер» ненадежный сервер в Интернете (где-то, как Rackspace). (сервер считается ненадежным, потому что клиенты, стоящие за брандмауэрами, не будут доверять ему, так как он находится на открытом сервере). Я не могу настроить параметры брандмауэра, чтобы сети могли напрямую соединяться друг с другом, потому что соединения не известны заранее время.

Это очень похоже на проблему с подключением NAT к NAT, например, с помощью инструментов справки удаленного рабочего стола (crossloop, copilot и т. Д.).

То, что я действительно хотел бы найти, - это способ открыть SSL-соединение между двумя узлами и предоставить серверу брандмауэр. Предпочтительно, когда хост A пытается подключиться к хосту B, он должен будет предоставить токен, который брокер может проверить с хостом B до установления соединения.

Чтобы добавить еще одну морщину к этому, механизм соединения должен поддерживать два типа связи. Во-первых, HTTP-запрос/ответ на веб-службу REST и второе постоянное соединение сокетов, чтобы разрешить передачу сообщений в реальном времени.

Я рассмотрел методы, которые я знаю о OpenSSL, используя сертификаты, OAuth и т. Д., Но я не вижу ничего, что вполне делает то, что мне нужно.

С кем-нибудь еще что-то занималось раньше? Любые указатели?

+0

Необходимо уделить особое внимание проверке другой стороны, поскольку ненадежный хост перенаправляет ваш трафик ... где-то, что может быть или не быть вашим назначенным пунктом назначения. – Piskvor 2010-11-30 17:17:34

ответ

1

В общем, SSL - это протокол на основе пакетов (с целью решения вашей задачи). Если вы можете пересылать пакеты вперед и назад, вы можете легко получить SSL-защищенный канал связи. Вам нужно что-то вроде нашего SSL/TLS components, что позволяет любой транспорт, а не только разъемы. То есть компонент сообщает вашему коду «отправить этот пакет на другую сторону» или «у вас есть что-нибудь для меня?» и ваш код взаимодействует с вашим промежуточным сервером.

+0

Я надеялся не переходить на уровень пакета. Я надеялся найти прокси-сервер с открытым исходным кодом HTTP/HTTPS, который позволит мне проксировать соединение с одного хоста на другой с шагом авторизации посередине. – Allen 2010-11-30 22:13:33

2

Вы можете решить вашу проблему с помощью простого SSL.

Просто подключите надежные серверные соединения между хостами-клиентами как непрозрачные TCP-соединения. Затем клиенты устанавливают сквозное SSL-соединение по этому переадресованному туннелю TCP - с OpenSSL, один клиент вызывает SSL_accept(), а остальные вызовы SSL_connect().

Используйте сертификаты, возможно, включая сертификаты клиентов, чтобы убедиться, что другой конец SSL-соединения - это тот, кого вы ожидаете от него.

(Это концептуально похоже на то, как HTTPS-соединения работают над веб-прокси - браузер просто говорит «подключи меня к этому месту назначения» и устанавливает соединение SSL с нужной конечной точкой. Прокси-сервер просто пересылает зашифрованные данные SSL назад и вперед, и поскольку у него нет закрытого ключа для правильного сертификата, он не может олицетворять желаемую конечную точку).