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.
@Khaine: A ustawiasz credentials? Z błędu wynika, że protokół wymaga uwierzytelniania, bo rozumiem, że callback ustawiłeś na ServicePointManager.ServerCertificateValidationCallback?
Podaj kod błędu albo porównaj w wireshark jak wygląda Client Hello dla SOAPUI i dla Twojej apki.
@budyn: Wygenerowało mi się samo z WSDLa. Klient dziedziczy po System.ServiceModel.ClientBase.
@Vetinari: Client Hello wygląda tak. Ten po lewej się udaje (SOAPUI), ten po prawej nie jestem pewien, bo dalej jeszcze coś się dzieje. Zaraz pokażę czym się różni.
@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?
Druga sprawa to logi z wireshark wyglądają jakby pokazywały tylko wysłane pakiety, a nie oderbane.
@Vetinari: Ah, jeszcze filtr w drugą stronę muszę ustawić. Tak to wygląda w obie strony już. Oczywiście w wersji nieudanej. Tam jest Unknown CA (48). Serwer mi to odesłał.
@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
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 loguj jak nie możesz debugować).
@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.
@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: 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.
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
@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...
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?
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.
Zgaduję, że certyfikat serwera nie jest zaufany w kliencie i się wywala.
Podaj kod błędu albo porównaj w wireshark jak wygląda Client Hello dla SOAPUI i dla Twojej apki.
Może spróbuj ustawić Ssl3 zamiast TLS?
https://github.com/Esri/resource-proxy/issues/399
@Vetinari: Client Hello wygląda tak. Ten po lewej się udaje (SOAPUI), ten po prawej nie jestem pewien, bo dalej jeszcze coś się dzieje. Zaraz pokażę czym się różni.
źródło: comment_RPxUdSiLh19VvulM8VwCyO43lVTTAFwz.jpg
Pobierzźródło: comment_awBNwNf36Ml2JF3rkLrXSPzjIANOWTly.jpg
PobierzDruga 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?
@Vetinari: Ah, jeszcze filtr w drugą stronę muszę ustawić. Tak to wygląda w obie strony już. Oczywiście w wersji nieudanej. Tam jest Unknown CA (48). Serwer mi to odesłał.
źródło: comment_eIIEQPdDFhOYSlskgydY3BPTh7xVbFJj.jpg
PobierzZró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
@Vetinari: Już jest tak zrobione.
Natomiast dla tej wiadomości source = ich IP, destination = moje IP.
źródło: comment_uYDpkmF7EP7XPZOHiIYhI3fTIGEBFxES.jpg
Pobierzhttps://stackoverflow.com/questions/33627593/c-sharp-net-how-to-allow-a-custom-root-ca-for-https-in-my-application-on
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication
Generalnie tutaj jest połączenie TLS sygnowane certyfikatem + potem jest WSSecurity w nagłówku SOAP. Ale do tego jeszcze nie doszliśmy.
źródło: comment_kiq1AYX0Z3qNuUTg95XoRTOSmNs5hUTv.jpg
Pobierz1) 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
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?
https://stackoverflow.com/questions/3383039/soap-body-is-not-encrypted-when-x509-security-implemented-on-wcf-service/3383467
Wszędzie się powtarza to wssBinding.