Wpis z mikrobloga

#csharp #programowanie #webdev

Komunikował się ktoś kiedyś za pomocą C# z webserwisem postawionym na Javie? Chodzi mi tu o sam kanał TLS połączenia, bo to już tutaj serwer gadać ze mną nie chce i dostaję raz po raz "Nie można utworzyć bezpiecznego kanału dla protokołu SSL/TLS z uwierzytelnieniem". "Wystawiciel" serwisu twierdzi, że to są jakieś standardowe ustawienia dla Javy, serwer HTTPS zapewne Apache zaś z mojej strony już masy rzeczy próbowałem i nawet raz mi się nie udało połączyć.

Na ten sam adres z poziomu przeglądarki jestem w stanie wejść jak podam odpowiedni certyfikat, ten sam certyfikat (.p12) ustawiony do połączenia z poziomu kodu i nie da rady. SOAPUI też się łączy z użyciem tego certyfikatu i nie ma problemu (tam jest bodaj obustronna weryfikacja, po swojej stronie mam debugowo ustawiony callback tak, że nieważne co mi zwrócą - to i tak zawsze będzie true).

Debugując te requesty Wiresharkiem ewidentnie widać, że .NET chce jakoś inaczej otworzyć te połączenia niż się spodziewają. Próbowałem już ustawiać różne ServicePointManager.SecurityProtocol, ale nic to nie dało (zresztą tam jest TLS 1.2, bo w Wiresharku widać).

Co jeszcze może być nie tak? To mi wygląda na jakąś różnicę w samym wykonywaniu handshake, bo jak certyfikat jest zły to mi zwraca informację o błędnym certyfikacie i żebym się walił na ryj.
  • 25
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Khaine: To jest po HTTPS? Jakiego klienta (klasy, bilioteki) używasz?
Zgaduję, że certyfikat serwera nie jest zaufany w kliencie i się wywala.
  • Odpowiedz
@Khaine: Wygląda na to, że Twój klient rozłącza połączenie. Może nie ma wspólnych metod szyfrownia? W tym nieudanym jest 21, w udanym 29. Możesz to rozwinąć i porównać?

Druga sprawa to logi z wireshark wyglądają jakby pokazywały tylko wysłane pakiety, a nie oderbane.

Postaw też breakpoint w tym callbacku od certyfikatu i zobacz czy tam wchodzi, może to nie działa i zrywa, bo nie akceptuje certyfikatu?
  • Odpowiedz
@Khaine A Nie odwrotnie? 443 to port serwera, a ten dłuższy to lokalny (klienta). Ja bym powiedział, że to Ty odpowiadasz dla servera Unknown CA. Sprawdź jeszcze raz tą logikę do certyfikatów, bo wygląda na to, że nie akceptujesz certyfikatu serwera ze względu na nieznane Certificate Authority.

Zrób w ServicePointManager.ServerCertificateValidationCallback lambdę z "retrun true" najwcześniej w kodzie jak się da, postaw na tym breakpoint i zobacz czy w ogóle wchodzi (albo
  • Odpowiedz
@Vetinari: Gdzie ustawić tego callbacka? Bo mam tylko klienta, który tak jak powiedziałem - dziedziczy z ClientBase. Reszta to jakieś jego wyparsowane z WSDLa bebechy. Więc ServicePointManager bądź jakaś inna statyczna ustawka, albo ten klient tylko mi zostaje.
  • Odpowiedz
@Vetinari: To jest rżnięte z konfiguracji XML. Wybacz że takie cenzury, ale branża w której pracuję jest tak ciasna, że wystarczy jedno IP albo wręcz nazwa jakiegoś obiektu aby już dało się mnie zidentyfikować osobie która jest z tym jakoś powiązana (takich osób jest dosłownie z 10 co prawda) xD

Generalnie tutaj jest połączenie TLS sygnowane certyfikatem + potem jest WSSecurity w nagłówku SOAP. Ale do tego jeszcze nie doszliśmy.
Khaine - @Vetinari: To jest rżnięte z konfiguracji XML. Wybacz że takie cenzury, ale ...

źródło: comment_kiq1AYX0Z3qNuUTg95XoRTOSmNs5hUTv.jpg

Pobierz
  • Odpowiedz
@Khaine: Ten certyfikat na samej górze to ten, który wsadzony w przeglądarkę pozwala mi się połączyć ze serwisem. Ten drugi teoretycznie powinien posłużyć do podpisu nagłówka, ale bladego pojęcia nie mam czy to tak zadziała.
  • Odpowiedz
@Khaine Ech, dlatego nie chciałem nigdy pisać w Javie EE. Nie wiem za bardzo jak Ci dalej pomóc, na Twoim miejscu zrobiłbym pewnie 2 rzeczy:
1) Znalazł w necie podobną konfigurację i porównał czy nie ma błędu, np (jest dużo więcej):
https://stackoverflow.com/questions/10853606/how-can-i-convert-this-app-config-wcf-client-configuration-to-code

2) Poprosił serwer o logi z Twojego połączenia i sprawdzenie czy przysyłasz certyfikat a jeżeli tak to poprawny. Jeżeli masz w ogóle prywatny klucz z serwera to możesz go
  • Odpowiedz
@Vetinari: Grzebanie w tych konfiguracjach to jak szukanie igły w stogu siana. Z tego co zauważyłem w wiresharku, to brakuje chyba certyfikatu uwierzytelniania systemu. C# dwa razy wysyła certa do uwierzytelnienia danych z tego co widzę. Jak je zamieniłem miejscami to się pulta, że certyfikat zdalny jest nieprawidłowy...
  • Odpowiedz
@Vetinari: No właśnie to zrobiłem.

FaultException: Missing wsse:Security header in request

No ale teraz się p--------i że koperta jest niepodpisana a nie że "won stąd robaku bo nie masz certyfikatu" ( ͡° ͜ʖ ͡°) Wiesz może jak podpisać envelopa SOAPowego?
  • Odpowiedz