2013-04-26 10 views
5

Próbuję skonfigurować serwer WWW w Delphi XE3 przy użyciu Indy i OpenSSL, które mogą obsługiwać ruch przez połączenia HTTP i HTTPS na tym samym porcie.Jak mogę obsługiwać ruch SSL i nie-SSL na tym samym porcie przy użyciu TIdTCPServer i OpenSSL w Delphi XE3?

Widziałem dwa główne podejścia do tego, i wydaje się, że nie działają one dla mnie.

Po pierwsze: z góry TLS/SSL. Obejmuje to czytanie pierwszych kilku bajtów strumienia w poszukiwaniu części "Client-Hello" niezabezpieczonego uzgadniania i (jeśli istnieje) wywołania odpowiedzi uzgadniania SSL serwera, ale jeśli to zrobię, biblioteka OpenSSL nie rozpoznaje uścisk dłoni, ponieważ usunąłem wiodące bajty wiadomości.

Po drugie: TLS po STARTTLS (lub odpowiedniku). Obejmuje to wysłanie specjalnego zestawu znaków (STARTTLS), po którym natychmiast następuje "Client-Hello". Serwer pozostawia cały komunikat uzgadniania protokołu SSL w stanie nienaruszonym, aby przejść do biblioteki OpenSSL. Problem z tym podejściem polega na tym, że większość przeglądarek internetowych go nie obsługuje (RFC 2817).

Na podsumowanie dwóch podejść, zajrzeć tutaj: What happens on the wire when a TLS/LDAP or TLS/HTTP connection is set up?)

Jak mogę obsługiwać ruch SSL i nie-SSL na tym samym porcie używając TIdHTTPServer i OpenSSL w Delphi XE3?

Odpowiedz

1

To, o co prosisz, nie jest możliwe w przypadku Indy po wyjęciu z pudełka. Jego domyślna implementacja SSL wykorzystuje tradycyjne API OpenSSL, w którym wykonuje wszystkie własne operacje wejścia/wyjścia gniazd, więc potrzebuje bezpośredniego dostępu do kompletnych danych uzgadniania bez uprzedniego podglądania danych. Jednak nie wszystko jest stracone. Masz kilka możliwości:

1) użyj biblioteki libpcap/Winpcap, aby uchwycić i sprawdzić pierwsze kilka bajtów nieprzetworzonych danych wychodzących z przewodu, aby uzyskać nowe połączenia, zanim gniazdo udostępni je aplikacji.

2) napisz własną klasę pochodną OpenSSL, czyli API SChannel Microsoftu, dzięki czemu będziesz mieć kontrolę nad gniazdem I/O i możesz odczytywać przychodzące bajty samodzielnie i patrzeć na nie, zanim wepchniesz je do silnik szyfrujący do przetwarzania.

+0

Dzięki za alternatywne sugestie! Zajrzę do tych i jeśli skończę wdrażanie któregokolwiek z nich, opublikuję ponownie tutaj. – Andy

2

Nie spodziewałbym się, że będzie to łatwe do wdrożenia dzięki Internet Direct (Indy) - serwer HTTP Apache nie może tego zrobić, a to oznacza albo a) prawie nikt nigdy nie chciał tej funkcji b) to nie jest takie proste do wdrożenia, a może c) może wprowadzić zagrożenia bezpieczeństwa.

od przyjętych odpowiedź na https://serverfault.com/questions/359461/apache-answer-both-http-and-https-on-the-same-port

to nie będzie to możliwe z Apache. Z Apache nie można korzystać z HTTPS i HTTP działającego na tym samym porcie, co .

Jestem świadomy istnienia kilku multiplikatorów portów zaprojektowanych do wykonywania HTTPS/OpenVPN lub SSH uruchamianych na tym samym porcie, ale wymagają one dodatkowego oprogramowania. I Nie jestem świadomy narzędzi, które będą multipleksować HTTPS i HTTP.