Pomijaj błędy nieprawidłowego certyfikatu SSL podczas wywoływania usług internetowych w .Net

88

Tworzymy nowy SharePoint, dla którego nie mamy jeszcze ważnego certyfikatu SSL. Chciałbym wywołać na nim usługę internetową Listy, aby pobrać metadane dotyczące konfiguracji. Jednak kiedy próbuję to zrobić, pojawia się wyjątek:

Połączenie bazowe zostało zamknięte: nie można ustanowić relacji zaufania dla bezpiecznego kanału SSL / TLS.

Zagnieżdżony wyjątek zawiera komunikat o błędzie:

Zdalny certyfikat jest nieważny zgodnie z procedurą weryfikacji.

To prawda, ponieważ używamy tymczasowego certyfikatu.

Moje pytanie brzmi: jak mogę powiedzieć klientowi usługi sieciowej .Net ( SoapHttpClientProtocol ), aby zignorował te błędy?

jan.vdbergh
źródło

Odpowiedzi:

18

Podejście, które zastosowałem, gdy miałem do czynienia z tym problemem, polegało na dodaniu osoby podpisującej tymczasowy certyfikat do listy zaufanych organów na danym komputerze.

Zwykle przeprowadzam testy z certyfikatami utworzonymi za pomocą CACERT, a dodanie ich do listy zaufanych organów zadziałało płynnie.

Zrobienie tego w ten sposób oznacza, że ​​nie musisz dodawać żadnego niestandardowego kodu do swojej aplikacji i poprawnie symuluje to, co się stanie po wdrożeniu aplikacji. W związku z tym uważam, że jest to lepsze rozwiązanie do programowego wyłączania kontroli.

Simon Johnson
źródło
To był również mój pierwszy pomysł. Niestety certyfikat również wygasł, więc nie można go zaufać.
jan.vdbergh,
Czy jest jakiś powód, dla którego nie możesz używać kogoś takiego jak CA cert? Jeśli jest to certyfikat testowy, możesz po prostu to zrobić. Nie jestem pewien, czy istnieje sposób, aby wyłączyć te kontrolki!
Simon Johnson,
113

Alternatywnie możesz zarejestrować delegata oddzwaniania, który ignoruje błąd certyfikacji:

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}
Alex Bagnolini
źródło
1
Dodałem tę statyczną metodę do global.asax i ustawiłem zdarzenie na „OnApplicationStart”. działał jak urok. Dzięki
Juan Zamora
1
@JuanZamora Zrobiłem to samo, co ty. Zadziałało!
Sachin BR
5
To wszystko, co musisz zrobić, jeśli chcesz być podatny na atak "Man in the Middle" ...
Houtman
2
Najlepiej byłoby to zrobić tylko w środowisku programistycznym.
Ron DeFreitas
79

Jak odpowiedź Jasona S.

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Umieszczam to w moim Main i sprawdzam moje app.configi sprawdzam, czy (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")przed wywołaniem tego wiersza kodu.

Keith Sirmons
źródło
24

Rozwiązałem to w ten sposób:

Wywołaj następujące informacje tuż przed wywołaniem usługi internetowej ssl, która powoduje ten błąd:

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}
Iman
źródło
12

Miałem ten sam błąd podczas korzystania z DownloadString; i udało się sprawić, że działa jak poniżej z sugestiami na tej stronie

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);
Dinesh Rajan
źródło
3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

pominie invaild ssl. Napisz go do konstruktora usługi internetowej.

hasanaydogar
źródło
1

Dla początkujących możesz rozszerzyć swoją częściową klasę usług w oddzielnym pliku cs i dodać kod dostarczony przez "imanabidi", aby go zintegrować

Senthil
źródło
1

Aby dalej rozwinąć post Simona Johnsonsa - Idealnie byłoby, gdybyś potrzebował rozwiązania, które będzie symulować warunki, które zobaczysz na produkcji, a modyfikowanie kodu tego nie zrobi i może być niebezpieczne, jeśli zapomnisz pobrać kod przed jego wdrożeniem.

Będziesz potrzebował jakiegoś certyfikatu z podpisem własnym. Jeśli używasz IIS Express, będziesz już mieć jeden z nich, po prostu musisz go znaleźć. Otwórz Firefoksa lub dowolną przeglądarkę, którą lubisz i przejdź do swojej witryny deweloperskiej. Powinno być możliwe wyświetlenie informacji o certyfikacie z paska adresu URL, aw zależności od przeglądarki powinno być możliwe wyeksportowanie certyfikatu do pliku.

Następnie otwórz MMC.exe i dodaj przystawkę Certyfikat. Zaimportuj plik certyfikatu do magazynu zaufanych głównych urzędów certyfikacji i to wszystko, czego potrzebujesz. Ważne jest, aby upewnić się, że trafia do tego sklepu, a nie do innego sklepu, takiego jak „Osobisty”. Jeśli nie znasz programu MMC lub certyfikatów, istnieje wiele witryn internetowych zawierających informacje, jak to zrobić.

Teraz twój komputer jako całość będzie niejawnie ufał wszystkim certyfikatom, które sam wygenerował i nie będziesz musiał dodawać kodu, aby to obsłużyć. Kiedy przejdziesz do produkcji, będzie ona nadal działać, pod warunkiem, że masz tam zainstalowany odpowiedni ważny certyfikat. Nie rób tego na serwerze produkcyjnym - byłoby to złe i nie zadziała dla żadnych innych klientów poza tymi na samym serwerze.

Nigel Thomas
źródło