wtorek, 16 grudnia 2008

HTTP 417 i Webservice

Ostatnio w firmie napisałem aplikację, która łączy się poprzez webservice do "bardzo ważnego" systemu z punktu widzenia firmy. Program służy ludziom w jednej zdalnej lokalizacji (nazwijmy ją LZ), natomiast serwer znajduje się gdzie indziej. Droga z jednego punktu do drugiego, jest raczej długa mimo niewielkiej geograficznej odległości (ok. 5km). Pewnego dnia aplikacja przestała działać (firma też w tym momencie znacznie zwolniła).

Ale do rzeczy, po krótkim wywiadzie okazało się, że wywołanie metod serwisu skutkuje rzuceniem wyjątku. Dokładnie WebException skarżący się na "HTTP ERROR 417: Expectation failed". Po dalszym wywiadzie o co chodzi, okazało się iż sprawa ma się z nieodpowiednimi wpisami w nagłówku HTTP. Po uruchomieniu aplikacji w innym miejscu niż LZ, problem znikł. Okazało się, że ISP dostarczający sieć do LZ miesza coś w HTTP przy pomocy transparentnego proxy.

No dobra problem zidentyfikowany, ale teraz jak go ominąć? Proste: zabrońmy dostawcy mieszać nam w strumieniu zabezpieczając go przez szyfrowanie. Włączamy w webserwisie SSL, uprzednio generując certyfikat przy pomocy wbudowanego w IIS generatora certyfikatów. Następnie trzeba zmusić program kliencki by bez pytania akceptował ten certyfikat. Tu posłużyłem się informacjami znalezionymi tutaj. W ten sposób ominąłem problem i dodatkowo zabezpieczyłem dane.