Wpis z mikrobloga

Witajcie Mirki,

Sorki za poprzednio sformatowany, a bardziej niesformatowany kod. Wrzucam jeszcze raz, z linkiem do Pastebin, Będę bardzo wdzięczny za pomoc.

Muszę skorzystać z web service'u SOAP, którego definicję dostałem w pliku *.wsdl. Korzysta on z uwierzytelniania przez HTTPS, dostałem więc certyfikat klucza publicznego X.509. Przeszedłem wszystko i myślałem, że zagra jak należy, ale dostaję błąd, o braku nasł#!$%@?ących endpointów, komunikat jak poniżej. Gdzie się potknąłem?

"System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at https://example.com:8443/test/ws/Service that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond ***."

Co aktualnie zrobiłem:

1. Dostawca poprosił o zmianę endpointu do serwisu testowego, więc edytowałem je w pliku *.wsdl.
2. Dodałem referencję do usługi w Microsoft Visual Studio.
3. Po tym, mój app.config został wygenerowany jak poniżej, endpoint jest właściwy.
4. Utworzyłem nową klasę do wczytywania certyfikatu, przypisywania i wywoływania połączenia. Kod poniżej.
5. Podczas debugowania kodu, wygląda na to, że certyfikat jest odnajdywany i ładowany, ale po wywołaniu metody Service.putData(), otrzymuję timeout i błąd o braku endpointu.

Service / app.config

Kod: https://pastebin.com/K7HsFwEi

Service / Console.cs

Kod: https://pastebin.com/3xNt0KHj

Za pomoc jestem skłonny dać plusa. Dzięki!

#programowanie #programista15k #csharp
  • 15
@Koliat: Zgadza się, witryna jest nieosiągalna. Jak rozumiem, powinienem dostać odpowiedź. Zakładam, że problem jest z uwierzytelnieniem. Instalowałem go dla usera i maszyny w "zaufanych urzędach certyfikacji", ma zaznaczone wszystkie cele. Musi zostać jako "użyty" przy wywoływaniu połączenia przez przeglądarkę?
@a-kow: To nie ma nic wspólnego z certyfikatami / uwierzytelnieniem - w ogóle nie dochodzi do tego etapu - albo nazwa Ci się nie rozwiązuje do IP, albo ich/Twój firewall blokuje połączenie, albo serwer jest wyłączony. Nie ma polączenia sieciowego dostępnego, więc nie działa
@Koliat: Domenę prawdopodobnie rozwiązuje do IP, bo w komunikacie "...or established connection failed because connected host has failed to respond ___." dostaję adres maszyny z portem 8443. Firewall również nie blokuje - wyłączyłem kompletnie zapory, a wirtyna cały czas nieosiągalna. Dostawca zapewnia, że endpoint jest aktywny od lat i nie jest zmieniany. W razie czego, na endpoincie produkcyjnym efekt mam ten sam.

()
@Kazaar: to miałby inny błąd zupełnie - @Kazaar: System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

@a-kow: to publiczny adres jakiś? Podaj mi adres na PW sprawdzę od siebie jak sięga?
@a-kow: U mnie w robocie niektóre ważne WS są obsługiwane tylko z konkretnych adresów IP/pulpitów zdalnych

Mówiąc inaczej: Nie podłączysz się do kluczowej usługi z dowolnego komputera - musi być on nie tylko uwierzytelniony przez certyfikat(y), ale również jego IP musi być dodane do "listy dostępowej". Może taką blokadę ma usługa z którą próbujesz się połączyć?
@Nartenlener: Dzięki za informację, Koliat również zasugerował "whitelistę" IP, więc orientuje się w tym temacie.

Przy okazji, na wszelki wypadek spytam. Czy magazyn, do którego zaimportujemy certyfikat ma tutaj znaczenie (jeśli i tak jestem w stanie go wydobyć z samej aplikacji) czy może być w dowolnym?
@a-kow: Czy miejsce składowania certyfikatów ma znaczenie to nie wiem, ale domyślam się że ma bo wszystkie które korzystam ich właściciele zalecali instalowanie w "Zaufanych urzędach certyfikacji"

Jest taki obiekt jak X509Store - on powinien mieć info o magazynach certyfikatów. Dla przykładu:

string certName = "NAZWA CERTYFIKATU";
X509Store certStore = new X509Store();
certStore.Open(OpenFlags.ReadOnly);

X509Certificate2 certificate = certStore.Certificates.Find(X509FindType.FindBySubjectName, certName, false)[0];