Jak obsługiwać zaszyfrowane i niezaszyfrowane połączenia HTTP za pośrednictwem jednego portu

10

Proszę spojrzeć na poniższy schemat.

alternatywny tekst

Jak to powinno działać?

  • Gdy zdalne żądanie http: // myhost.com:8080/*, żądanie powinno zostać przesłane do serwera http, który nasłuchuje na porcie 8008 interfejsu pętli zwrotnej. To jest łatwa część.

  • Gdy zdalny użytkownik zażąda http: // myhost.com:8080/specialurl ...

    • Program działający jako brama na poziomie aplikacji powinna mieć możliwość uaktualnienia połączenia do zaszyfrowanej sesji ( bez zmiany portów )

    • Po ustanowieniu zaszyfrowanej sesji za pomocą zdalnej przeglądarki powinien przesłać żądanie do programu C, który nasłuchuje na porcie 8000 interfejsu sprzężenia zwrotnego

Moje pytania to :

  1. Czy kiedykolwiek wdrażałeś takie rozwiązanie w środowisku produkcyjnym? Jeśli masz...
  2. Jakiego produktu użyłeś, aby działać jako brama aplikacji?
  3. Czy możesz podać przykład konfiguracji?

Ostre ograniczenia :

  • Nie mam kontroli nad zaporą , a jedynym portem, przez który mogę przenosić ruch zewnętrzny do serwera wewnętrznego, jest 8080. Numer portu jest nieistotny, chodzi o to, że na poziomie zapory jest tylko jeden port, który przekazuje przychodzące wiadomości ruch do wewnętrznego serwera.
  • Serwer wewnętrzny musi działać pod Linuksem (obecnie działa Debian Lenny)
  • Zdalni użytkownicy nie potrzebują niczego więcej niż bieżącej przeglądarki internetowej i połączenia internetowego, aby uzyskać dostęp do tego serwera. Oznacza to, że zwrotne przekierowanie portów przez SSH nie jest tutaj opcją.
  • Potrzebuję produktu, który został przetestowany w produkcji i można go łatwo wdrożyć. Nie zamierzam tworzyć własnej bramy aplikacji (gdyby tak było, myślę, że zadałbym to pytanie w przypadku przepełnienia stosu zamiast zadawać je w przypadku błędu serwera).

Miękkie ograniczenia :

  • Chciałbym uniknąć umieszczania Apache jako bramy aplikacji (chociaż jestem gotów to zrobić, jeśli jest to jedyny możliwy wybór)
  • Jeśli to możliwe, brama aplikacji powinna być dojrzałym oprogramowaniem typu open source.

Produkty wypróbowane do tej pory jako bramy aplikacji (bez powodzenia)

  • nginx
  • lighttpd
  • funt

Odpowiednie RFC

  • RFC2817 (... wyjaśnia, jak użyć mechanizmu aktualizacji w HTTP / 1.1 do zainicjowania Transport Layer Security (TLS) przez istniejące połączenie TCP. Pozwala to niezabezpieczonemu i zabezpieczonemu ruchowi HTTP współdzielić ten sam dobrze znany port ...)
  • RFC2818 (... opisuje, jak używać TLS do zabezpieczania połączeń HTTP przez Internet. Obecna praktyka polega na warstwowaniu HTTP przez SSL (poprzednik TLS), odróżniając zabezpieczony ruch od niezabezpieczonego ruchu przy użyciu innego portu serwera ... )
alemartini
źródło
„Gdy zdalny użytkownik zażąda http: // myhost.com:8080/specialurl ... Program działający jako brama na poziomie aplikacji powinna mieć możliwość uaktualnienia połączenia do zaszyfrowanej sesji (bez zmiany portów)” ... jak to zrobić to możliwe po stronie klienta? Czy przeglądarka kliencka będzie obsługiwać SSL za pośrednictwem adresu URL, który nie zawiera https?
Adam Brand
Cześć Adam, i dziękuję za pozostawienie komentarza. Po wysłaniu żądania myhost.com:8080/specialurl przeglądarka powinna zostać przekierowana na myhost.com:8080/specialurl . Nie jestem pewien co do innych przeglądarek, ale najnowsze wersje Opera i Firefox wydają się wspierać to bez problemów.
alemartini,

Odpowiedzi:

1

Jeden port do rządzenia nimi wszystkimi, pokazuje , że ktoś przynajmniej zaimplementował go w świecie Java.

Czy kiedykolwiek wdrażałeś takie rozwiązanie w środowisku produkcyjnym?

Nie mam - i nigdy nie zaleciłbym, aby to zrobić. Jako konsultant staram się zachęcić moich klientów do korzystania ze standardowych i sprawdzonych technologii. Żaden system nie wydaje się poprawnie implementować tych RFC, z wyjątkiem przypadków skrajnych - i nie byłoby to coś, co chciałbym zasugerować lub wesprzeć.

SirStan
źródło
Cześć Stan i dziękuję za opinię. Nie wiedziałem o Grizzly i niestety nie znam Javy. Czy kiedykolwiek wdrażałeś takie rozwiązanie w środowisku produkcyjnym? Byłoby wspaniale, gdybyś mógł podać przykład pokazujący, jak to zrobić. Jeszcze raz dziękuję, Alex.
alemartini
Ok, dziękuję za edycję odpowiedzi i dodanie dodatkowych informacji. Jak widać, zawęziłem moje pytanie, stwierdzając jaśniej, że szukam dojrzałego produktu. Zobaczmy, czy ktoś wymyśli dobrą odpowiedź na to pytanie. Trudno uwierzyć, że Apache jest jedyną aplikacją w świecie Linuksa, która obsługuje RFC2817. Ale jeśli tak jest, lub jeśli nikt inny nie ma doświadczenia w rzeczywistym wdrażaniu czegoś takiego z innym produktem, myślę, że nie będę miał wyboru, prócz rozwiązania tego za pomocą Apache.
alemartini,
0

Apache ci tu nie pomoże. Może nasłuchiwać tylko połączeń HTTP lub HTTPS (nie obu) na danym porcie.

O ile mi wiadomo, nie ma „dojrzałego produktu”, który implementuje tę funkcjonalność. Poproś administratora sieci o wybicie kolejnej dziury w zaporze ogniowej lub skonfiguruj tunel VPN lub SSH do zewnętrznego punktu końcowego, w którym możesz skonfigurować wiele portów nasłuchujących.

Duskwuff -inactive-
źródło