Nie możemy połączyć się z serwerem HTTPS przy użyciu WebRequest
tego komunikatu o błędzie:
The request was aborted: Could not create SSL/TLS secure channel.
Wiemy, że serwer nie ma ważnego certyfikatu HTTPS z użytą ścieżką, ale aby ominąć ten problem, używamy następującego kodu, który pobraliśmy z innego wpisu StackOverflow:
private void Somewhere() {
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}
private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
return true;
}
Problem polega na tym, że serwer nigdy nie sprawdza poprawności certyfikatu i kończy się niepowodzeniem z powyższym błędem. Czy ktoś ma pojęcie o tym, co powinienem zrobić?
Powinienem wspomnieć, że kolega i ja przeprowadziliśmy testy kilka tygodni temu i działało dobrze z czymś podobnym do tego, co napisałem powyżej. Jedyną „główną różnicą”, którą znaleźliśmy, jest to, że korzystam z systemu Windows 7, a on z Windows XP. Czy to coś zmienia?
The request was aborted: Could not create SSL/TLS secure channel
jest bardzo ogólny. Mówi w zasadzie: „Inicjowanie połączenia SSL / TLS / HTTPS nie powiodło się z jednego z wielu możliwych powodów”. Jeśli więc otrzymujesz go regularnie w określonej sytuacji, najlepszym rozwiązaniem jest zadanie konkretnego pytania zawierającego szczegółowe informacje na temat tej sytuacji. I sprawdzanie Podglądu zdarzeń, aby uzyskać więcej informacji. I / lub włącz niektóre debugowanie po stronie klienta .NET, aby uzyskać więcej szczegółów (czy certyfikat serwera nie jest zaufany? Czy istnieje niezgodność szyfru? Niezgodność wersji protokołu SSL / TLS itp.).Odpowiedzi:
W końcu znalazłem odpowiedź (nie zanotowałem swojego źródła, ale pochodziło ono z wyszukiwania);
Chociaż kod działa w systemie Windows XP, w systemie Windows 7 należy dodać go na początku:
A teraz działa idealnie.
UZUPEŁNIENIE
Jak wspomniano Robin French; jeśli napotykasz ten problem podczas konfigurowania PayPal, pamiętaj, że nie będą one obsługiwać protokołu SSL3 od 3 grudnia 2018 r. Musisz użyć TLS. Oto strona Paypal na ten temat.
źródło
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
Rozwiązaniem tego jest .NET 4.5
Jeśli nie masz .NET 4.5, użyj
źródło
ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
Upewnij się, że ustawienia ServicePointManager zostały wprowadzone przed utworzeniem HttpWebRequest, w przeciwnym razie nie będzie działać.
Pracuje:
Nie działa:
źródło
Problemem jest to, że użytkownik aspNet nie ma dostępu do certyfikatu. Musisz dać dostęp za pomocą programu winhttpcertcfg.exe
Przykład konfiguracji tego ustawienia znajduje się na stronie: http://support.microsoft.com/kb/901183
W kroku 2 więcej informacji
EDYCJA: W nowszych wersjach IIS ta funkcja jest wbudowana w narzędzie menedżera certyfikatów - i można uzyskać do niej dostęp, klikając prawym przyciskiem myszy certyfikat i korzystając z opcji zarządzania kluczami prywatnymi. Więcej informacji tutaj: /server/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791
źródło
Błąd jest ogólny i istnieje wiele powodów, dla których negocjacja SSL / TLS może się nie powieść. Najczęstszym z nich jest nieprawidłowy lub wygasły certyfikat serwera, a zadbałeś o to, udostępniając własny haczyk sprawdzania poprawności certyfikatu serwera, ale nie jest to jedyny powód. Serwer może wymagać wzajemnego uwierzytelnienia, może być skonfigurowany z zestawami szyfrów nieobsługiwanych przez klienta, może upłynąć zbyt duży czas, aby uzgadnianie zakończyło się sukcesem i wiele innych powodów.
Najlepszym rozwiązaniem jest użycie zestawu narzędzi do rozwiązywania problemów SChannel. SChannel jest dostawcą SSPI odpowiedzialnym za SSL i TLS, a twój klient użyje go do uzgadniania. Spójrz na Narzędzia i ustawienia TLS / SSL .
Zobacz także Jak włączyć rejestrowanie zdarzeń Schannel .
źródło
Schannel event logging
w systemie Windows 7-8-10 ?Miałem ten problem, próbując trafić na https://ct.mob0.com/Styles/Fun.png , który jest obrazem rozpowszechnianym przez CloudFlare na jego CDN, który obsługuje szalone rzeczy, takie jak SPDY i dziwne przekierowujące certyfikaty SSL.
Zamiast określenia Ssl3, jak w odpowiedzi Simonsa, udało mi się to naprawić, przechodząc do Tls12 w następujący sposób:
źródło
Po wielu długich godzinach pracy z tym samym problemem stwierdziłem, że konto ASP.NET, pod którym działała usługa klienta, nie miało dostępu do certyfikatu. Naprawiłem to, wchodząc do puli aplikacji IIS, w której działa aplikacja internetowa, przechodząc do Ustawień zaawansowanych i zmieniając Tożsamość na
LocalSystem
kontoNetworkService
.Lepszym rozwiązaniem jest uzyskanie certyfikatu do pracy z
NetworkService
kontem domyślnym, ale działa to na szybkie testy funkcjonalne.źródło
Podejście z ustawieniem
Wydaje się być w porządku, ponieważ Tls1.2 to najnowsza wersja bezpiecznego protokołu. Ale postanowiłem spojrzeć głębiej i odpowiedzieć, czy naprawdę musimy go na stałe zakodować.
Specyfikacja: Windows Server 2012R2 x64.
Z Internetu mówi się, że .NetFramework 4.6+ musi domyślnie używać Tls1.2. Ale kiedy zaktualizowałem swój projekt do 4.6, nic się nie stało. Znalazłem informacje, które mówią, że muszę ręcznie wprowadzić zmiany, aby domyślnie włączyć Tls1.2
https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi
Ale proponowana aktualizacja systemu Windows nie działa w wersji R2
Ale pomogło mi dodanie 2 wartości do rejestru. Możesz użyć następnego skryptu PS, aby zostały dodane automatycznie
Tego właśnie szukałem. Ale nadal nie mogę odpowiedzieć na pytanie, dlaczego NetFramework 4.6+ nie ustawia tego ... Wartość protokołu automatycznie?
źródło
Coś, czego pierwotna odpowiedź nie miała. Dodałem trochę kodu, aby był kuloodporny.
źródło
Tls and Tls11
są przestarzałe ?SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes
będzie dostępna tylko prawidłowa opcjaServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
?Inną możliwością jest niewłaściwy import certyfikatu na skrzynkę. Pamiętaj, aby zaznaczyć zaznaczone pole wyboru. Początkowo tego nie zrobiłem, więc upłynął limit czasu lub wyrzucono ten sam wyjątek, ponieważ nie można znaleźć klucza prywatnego.
źródło
Wyjątek „Żądanie zostało przerwane: nie można utworzyć bezpiecznego kanału SSL / TLS” może wystąpić, jeśli serwer zwraca nieautoryzowaną odpowiedź HTTP 401 na żądanie HTTP.
Możesz ustalić, czy tak się dzieje, włączając rejestrowanie System.Net na poziomie śledzenia dla aplikacji klienckiej, jak opisano w tej odpowiedzi .
Po skonfigurowaniu rejestrowania uruchom aplikację i odtwórz błąd, a następnie spójrz na dane wyjściowe rejestrowania w taki sposób:
W mojej sytuacji nie ustawiłem określonego pliku cookie, którego oczekiwał serwer, co spowodowało, że serwer odpowiedział na żądanie z błędem 401, co z kolei doprowadziło do wyjątku „Nie można utworzyć bezpiecznego kanału SSL / TLS”.
źródło
2 errors in 2 months
). Kiedy pojawia się błąd, później kilka minut próbuję ponownie ręcznie i wszystko jest w porządku.Inną możliwą przyczyną
The request was aborted: Could not create SSL/TLS secure channel
błędu jest niedopasowanie między wartościami skonfigurowanymi dla komputera klienta a wartościami, które serwer skonfigurował jako chętny i zdolny do zaakceptowania . W takim przypadku, gdy klient wysyła listę wartości cipher_suites, które jest w stanie zaakceptować w początkowym komunikacie „Client Hello” uzgadniania / negocjacji SSL, serwer widzi, że żadna z podanych wartości nie jest akceptowana, i może zwrócić komunikat „Alert” ”zamiast przejść do kroku„ powitanie serwera ”uzgadniania SSL.Aby zbadać tę możliwość, możesz pobrać Microsoft Message Analyzer i użyć go do uruchomienia śledzenia negocjacji SSL, które występują, gdy próbujesz nawiązać połączenie HTTPS z serwerem (w aplikacji C #).
Jeśli możesz nawiązać udane połączenie HTTPS z innego środowiska (np. Z komputera z systemem Windows XP, o którym wspomniałeś - lub być może poprzez naciśnięcie adresu URL HTTPS w przeglądarce innej niż Microsoft, która nie korzysta z ustawień pakietu szyfrów systemu operacyjnego, takich jak Chrome lub Firefox), uruchom inne śledzenie Message Analyzer w tym środowisku, aby uchwycić, co się stanie, gdy negocjacja SSL się powiedzie.
Mamy nadzieję, że zauważysz pewną różnicę między dwiema wiadomościami Hello Hello, która pozwoli ci dokładnie wskazać, co w niepowodzeniu negocjacji SSL powoduje niepowodzenie. Następnie powinieneś być w stanie dokonać zmian w konfiguracji systemu Windows, które pozwolą mu odnieść sukces. IISCrypto jest świetnym narzędziem do tego celu (nawet dla komputerów klienckich, pomimo nazwy „IIS”).
Następujące dwa klucze rejestru systemu Windows regulują wartości cipher_suites, których będzie używał komputer:
Oto pełny opis tego, jak zbadałem i rozwiązałem wystąpienie tego rodzaju
Could not create SSL/TLS secure channel
problemu: http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.htmlźródło
Źródłem tego wyjątku w moim przypadku było to, że w pewnym momencie kodu wywoływano:
To jest naprawdę złe. Nie tylko instruuje .NET, aby korzystał z niezabezpieczonego protokołu, ale ma to wpływ na każde nowe żądanie WebClient (i podobne) złożone później w Twojej domenie. (Należy pamiętać, że przychodzące żądania sieciowe nie są zmieniane w aplikacji ASP.NET, ale nowe żądania WebClient, takie jak rozmowa z zewnętrzną usługą internetową, są).
W moim przypadku nie było to tak naprawdę potrzebne, więc mogłem po prostu usunąć oświadczenie, a wszystkie inne moje żądania sieciowe znów działały poprawnie. Na podstawie lektury przeprowadzonej w innym miejscu nauczyłem się kilku rzeczy:
źródło
Miałem ten problem, ponieważ mój plik web.config miał:
i nie:
źródło
Jak widać, istnieje wiele powodów, dla których może się to zdarzyć. Pomyślałem, że dodam przyczynę, z którą się spotkałem ...
Jeśli ustawisz wartość
WebRequest.Timeout
na0
, jest to zgłaszany wyjątek. Poniżej znajduje się kod, który miałem ... (Z wyjątkiem zamiast na stałe zakodowanej0
wartości limitu czasu, miałem parametr, który został przypadkowo ustawiony na0
).źródło
Najczęściej głosowana odpowiedź prawdopodobnie wystarczy dla większości ludzi. Jednak w niektórych okolicznościach możesz nadal wyświetlać błąd „Nie można utworzyć bezpiecznego kanału SSL / TLS”, nawet po wymuszeniu TLS 1.2. Jeśli tak, możesz przeczytać ten pomocny artykułdla dodatkowych kroków rozwiązywania problemów. Podsumowując: niezależnie od wydania wersji TLS / SSL, klient i serwer muszą uzgodnić „pakiet szyfrów”. Podczas fazy uzgadniania połączenia SSL klient wyświetli listę obsługiwanych zestawów szyfrów, aby serwer mógł sprawdzić na swojej liście. Ale na niektórych komputerach z systemem Windows niektóre typowe zestawy szyfrów mogły zostać wyłączone (najwyraźniej z powodu dobrych intencji ograniczenia powierzchni ataku), co zmniejsza prawdopodobieństwo uzgodnienia przez klienta i serwer pakietu szyfrów. Jeśli nie mogą się zgodzić, w przeglądarce zdarzeń może pojawić się „fatal alert code 40” i „Nie można utworzyć bezpiecznego kanału SSL / TLS” w programie .NET.
W powyższym artykule wyjaśniono, jak wyświetlić listę wszystkich potencjalnie obsługiwanych pakietów szyfrów komputera i włączyć dodatkowe pakiety szyfrów za pośrednictwem rejestru systemu Windows. Aby sprawdzić, które zestawy szyfrów są włączone na kliencie, spróbuj odwiedzić tę stronę diagnostyczną w MSIE. (Korzystanie ze śledzenia System.Net może dać bardziej ostateczne wyniki.) Aby sprawdzić, które zestawy szyfrów są obsługiwane przez serwer, wypróbuj to narzędzie online (zakładając, że serwer jest dostępny w Internecie). Nie trzeba dodawać, że zmiany w rejestrze muszą być wykonywane ostrożnie , szczególnie w przypadku sieci. (Czy twoja maszyna jest zdalnie hostowaną maszyną wirtualną? Jeśli miałbyś przerwać pracę w sieci, czy maszyna wirtualna byłaby w ogóle dostępna?)
W przypadku mojej firmy włączyliśmy kilka dodatkowych pakietów „ECDHE_ECDSA” poprzez edycję rejestru, aby naprawić natychmiastowy problem i uchronić się przed przyszłymi problemami. Ale jeśli nie możesz (lub nie będziesz) edytować Rejestru, przychodzą na myśl liczne obejścia (niekoniecznie ładne). Na przykład: Twój program .NET może delegować ruch SSL do osobnego programu w języku Python (który sam może działać, z tego samego powodu, dla którego żądania Chrome mogą się powieść w przypadku niepowodzenia żądań MSIE na zagrożonym komputerze).
źródło
Jedną z największych przyczyn tego problemu jest aktywna wersja .NET Framework. Wersja środowiska uruchomieniowego .NET wpływa na to, które protokoły bezpieczeństwa są domyślnie włączone.
Wydaje się, że nie ma żadnej wiarygodnej dokumentacji na temat tego, jak to konkretnie działa w różnych wersjach, ale wydaje się, że wartości domyślne są określone mniej więcej w następujący sposób:
(W przypadku starszych wersji przebieg może się nieco różnić w zależności od tego, które środowiska uruchomieniowe .NET są zainstalowane w systemie. Na przykład może wystąpić sytuacja, w której używasz bardzo starej struktury i nie jest obsługiwany protokół TLS 1.0 lub 4.6. x i TLS 1.3 nie są obsługiwane)
Dokumentacja Microsoft zdecydowanie zaleca używanie wersji 4.7+, a ustawienia domyślne systemu:
W przypadku witryn ASP.NET sprawdź wersję środowiska .NET w swoim
<httpRuntime>
elemencie, ponieważ określa to, które środowisko wykonawcze jest faktycznie używane przez witrynę:Lepszy:
źródło
Ten działa dla mnie w Mcl Webclient
źródło
W przypadku, gdy klient jest komputerem z systemem Windows, możliwym powodem może być to, że protokół tls lub ssl wymagany przez usługę nie jest aktywowany.
Można to ustawić w:
Przewiń ustawienia w dół do „Bezpieczeństwo” i wybierz pomiędzy
źródło
W moim przypadku konto usługi z uruchomioną aplikacją nie miało uprawnień dostępu do klucza prywatnego. Gdy dałem pozwolenie, błąd zniknął
źródło
Jeśli uruchamiasz swój kod z Visual Studio, spróbuj uruchomić Visual Studio jako administrator. Naprawiono problem dla mnie.
źródło
Walczyłem z tym problemem przez cały dzień.
Kiedy stworzyłem nowy projekt .NET 4.5, w końcu udało mi się go uruchomić.
Ale jeśli obniżyłem wersję do 4.0, znów miałem ten sam problem i było to nieodwracalne dla tego projektu (nawet gdy próbowałem ponownie zaktualizować do wersji 4.5).
Nie dziwny żaden inny komunikat o błędzie, ale „Żądanie zostało przerwane: nie można utworzyć bezpiecznego kanału SSL / TLS”. wymyślił ten błąd
źródło
W naszym przypadku korzystaliśmy z dostawcy oprogramowania, więc nie mieliśmy dostępu do modyfikowania kodu .NET. Najwyraźniej .NET 4 nie będzie używać TLS v 1.2, chyba że nastąpi zmiana.
Rozwiązaniem dla nas było dodanie klucza SchUseStrongCrypto do rejestru. Możesz skopiować / wkleić poniższy kod do pliku tekstowego z rozszerzeniem .reg i go wykonać. Służył jako nasza „łatka” do problemu.
źródło
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Spróbuj tego:
źródło
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
To naprawiło dla mnie, dodaj usługę sieciową do uprawnień. Kliknij prawym przyciskiem myszy certyfikat> Wszystkie zadania> Zarządzaj kluczami prywatnymi ...> Dodaj ...> Dodaj „Usługa sieciowa”.
źródło
Problem polegał na tym, że próbowałem wdrożyć na IIS jako usługę internetową, zainstalowałem certyfikat na serwerze, ale użytkownik, który uruchamia IIS, nie miał odpowiednich uprawnień do certyfikatu.
Jak przyznać ASP.NET dostęp do klucza prywatnego w certyfikacie w magazynie certyfikatów?
źródło
Miałem ten sam problem i stwierdziłem, że ta odpowiedź działała poprawnie dla mnie. Klucz to 3072. Ten link zawiera szczegółowe informacje na temat poprawki „3072”.
W moim przypadku poprawka wymagała dwóch kanałów:
źródło
To pytanie może zawierać wiele odpowiedzi, ponieważ dotyczy ogólnego komunikatu o błędzie. Ten problem wystąpił na niektórych naszych serwerach, ale nie na naszych komputerach programistycznych. Po wyciągnięciu większości naszych włosów stwierdziliśmy, że był to błąd firmy Microsoft.
https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect
Zasadniczo MS zakłada, że chcesz słabszego szyfrowania, ale system operacyjny jest załatany tak, aby zezwalał tylko na TLS 1.2, więc otrzymujesz przerażające „Żądanie zostało przerwane: Nie można utworzyć bezpiecznego kanału SSL / TLS”.
Istnieją trzy poprawki.
1) Popraw system operacyjny za pomocą odpowiedniej aktualizacji: http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166
2) Dodaj ustawienie do pliku app.config / web.config.
3) Dodaj ustawienie rejestru, które zostało już wspomniane w innej odpowiedzi.
Wszystkie te są wymienione w artykule bazy wiedzy, który zamieściłem.
źródło
Inną możliwością jest to, że wykonywany kod nie ma wymaganych założeń.
W moim przypadku wystąpił ten błąd podczas używania debugera programu Visual Studio do testowania połączenia z usługą internetową. Program Visual Studio nie działał jako administrator, co spowodowało ten wyjątek.
źródło
Działo się to dla mnie tylko na jednej stronie i okazało się, że miał tylko dostępny szyfr RC4. Wcześniej próbując zahartować serwer, wyłączyłem szyfr RC4, kiedy ponownie włączyłem ten problem, problem został rozwiązany.
źródło