ServerCertificateValidationCallback ayarlanmasına rağmen SSL / TLS güvenli kanal oluşturulamadı


85

Kendinden imzalı sertifika ile sunucuyu test etmek için SSL / TLS bağlantısı kurmaya çalışıyorum . Güvenli olmayan kanal üzerinden iletişim sorunsuz çalıştı.

İşte bu çözümlere dayanarak yazdığım örnek kodum: HttpClient C # ile Güvenilmeyen SSL Sertifikalarına İzin Verme Sertifika hatalarını yoksay? Ssl Web API'ye bağlanan .NET istemcisi

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

bunu da denedi:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

ve bu

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

ama her seferinde bir istisnam var:

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

Neyi yanlış yapıyorum? Neden bu sunucuya bağlanamıyorum (geçersiz kendinden imzalı sertifikaya sahip)

Yanıtlar:


166

ServerCertificateValidationCallback ile bunu doğru yapıyorsunuz. Karşılaştığınız sorun bu değil. Karşılaştığınız sorun büyük olasılıkla SSL / TLS protokolünün sürümüdür.

Örneğin, sunucunuz yalnızca SSLv3 ve TLSv10 sunuyorsa ve istemcinizin TLSv12'ye ihtiyacı varsa, bu hata mesajını alırsınız. Yapmanız gereken, hem istemcinin hem de sunucunun desteklenen ortak bir protokol sürümüne sahip olduğundan emin olmaktır.

Mümkün olduğu kadar çok sunucuya bağlanabilen bir istemciye ihtiyacım olduğunda (mümkün olduğu kadar güvenli olmak yerine) bunu kullanıyorum (doğrulama geri aramasını ayarlayarak):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

1
Benzer bir sorunum var. POODLE saldırısı nedeniyle sunucumuzdaki TLS 1.0'ı kapatmak zorunda kaldık. Bunu yaptığımda üçüncü taraf bir uygulama çalışmayı durduruyor. Assambly'nin derlemesini çözmek, sizinkine benzer bir kod gösterir. GetAsync yerine webclientc.SendAsync kullanır. Kodu test etmek için bir konsol uygulamasına kopyalarsam, hatayı yeniden oluşturabilirim ve ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 ekleyerek çalışır. Hangi TLS sürümünü kullanacağımı ortaya çıkarmak için sunucu ile İstemci arasında bir tür anlaşma olacağını düşündüm. 1.0 devre dışı bırakıldığında neden otomatik olarak 1.1'i seçmiyor?
Engern

3
Teşekkürler! Bununla 3 saat mücadele ediyordu. Bu satırı eklemek benim için yaptı:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Thomas T

1
NET'in daha yeni sürümünün varsayılan olarak etkinleştirildiğini unutmayın, tek yapmamız gereken .NET sürümünü
4.6.1'e

1
Tam olarak, geçerli ya da değil, umursamadığınız anlamına gelir. Bu geri arama, o sertifikada herhangi bir güvenlik kontrolünden kaçınmanıza olanak tanır.
Wapac

1
Harika yanıt, bu ServicePointManager.SecurityProtocoldeğerin varsayılan değer olması gerektiğini düşünüyorum. Ya da en azından doğrudan fırlatılan İstisnanın içinde daha fazla içgörü olmalıdır.
Çad

28

Aynı sorunu bugün çözüyoruz ve tek yapmanız gereken .NET'in çalışma zamanı sürümünü artırmak.

4.5.2 yukarıdaki sorunla bizim için işe yaramadı , 4.6.1 iyiydi

.NET sürümünü korumanız gerekiyorsa,

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

1
Hangi varyantları kullandınız ve tam olarak nasıl?
martinh_kentico

1
Bugünden itibaren belirli bir SSL sitesiyle çalışmayacak bir .NET 4.5 uygulamam var. 4.6.1'e değiştirirsem iyi çalışıyor, ancak gerçekten değiştiremem. Orada ne yapılacağından emin değilim: |
Tsury

16

Hala bununla karşılaşan herhangi birinin takibi olarak - çözümde belirtildiği gibi ServicePointManager.SecurityProfile seçeneklerini ekledim:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Yine de aynı "İstek iptal edildi: SSL / TLS güvenli kanal oluşturulamadı" hatasını almaya devam ettim. HTTPS SOAP API arayüzlerine sahip bazı eski ses sunucularına bağlanmaya çalışıyordum (ör. Sesli posta, IP telefon sistemleri vb. Yıllar önce yüklenmiş). Bunlar, yıllar önce en son güncellendikleri haliyle yalnızca SSL3 bağlantılarını destekler.

SSl3'ün SecurityProtocols listesine dahil edilmesi burada işe yarayacağını düşünebilirdi, ama olmadı. Bağlantıyı zorlayabilmemin tek yolu YALNIZCA Ssl3 protokolünü dahil etmekti ve başkalarını içermemekti:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Sonra bağlantı devam ediyor - bana bir hata gibi görünüyor, ancak bu, yıllardır orada bulunan bu sunucular için sağladığım araçlarda yakın zamana kadar hata vermeye başlamadı - Microsoft'un bunu güncelleyen sistem değişikliklerini uygulamaya başladığına inanıyorum Başka bir alternatif olmadığı sürece TLS bağlantılarını zorlama davranışı.

Her neyse - bazı eski sitelere / sunuculara karşı hala bununla karşılaşıyorsanız, denemeye değer.


1
PowerShell aracılığıyla Cisco Unified Communications AXL api'yi kullanmak için bir CUCMPowerShell modülümüz var ve yanıtınız ekleyerek bunu düzeltmemize yardımcı oldu [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Ssl3. Teşekkür ederim! Tam kod Invoke-CUCMSOAPAPIFunction'da görülebilir
Chris Magnuson

2
@Jeff - Bağlantılı makaleye göz atın. Sanırım Ssl3'ün neden çalışmadığını açıklayabilir ve Ssl3'ü yeniden etkinleştirmek için iki yol önerebilir. docs.microsoft.com/en-us/dotnet/framework/migration-guide/…
Scott

4

bu satırı taşıyın: ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Bu satırdan önce: HttpWebRequest isteği = (HttpWebRequest) WebRequest.Create (uri);

Orijinal gönderi: KB4344167 güvenlik güncellemesi TLS Kodunu bozuyor


1
Yukarıdakilerin hepsini boşuna denedikten sonra cevap şuydu: HttpWebRequest'i oluşturmadan önce ServicePointManager'ın ayarlanması gerekiyor.
Henry Rusted

2

Benim durumumda TLS1_2 hem istemcide hem de sunucuda etkinleştirildi, ancak istemci devre dışı bırakılırken sunucu MD5 kullanıyordu. Bu nedenle, http://ssllabs.com adresinde hem istemciyi hem de sunucuyu test edin veya neler olduğunu görmek için openssl / s_client kullanarak test edin. Ayrıca, Wireshark kullanarak seçilen şifreyi kontrol edin.


1

TLS 1.0 ve 1.1 artık Kullanım Ömrünün Sonu durumundadır. Amazon web sunucumuzdaki bir paket güncellendi ve bu hatayı almaya başladık.

Cevap üzerindedir, ancak kullanmamalısınız tlsya tls11artık.

Özellikle ASP.Net için, bunu başlatma yöntemlerinizden birine ekleyin.

        public Startup()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;

ama eminim bunun gibi bir şey diğer birçok durumda işe yarayacaktır.


0

Yeni bir alan adı kullanıyorsanız ve yukarıdakilerin hepsini gerçekleştirdiyseniz ve hala aynı hatayı alıyorsanız, PC'nizdeki DNS önbelleğini temizleyip temizlemediğinizi kontrol edin. Daha fazla ayrıntı için DNS'inizi temizleyin .

Windows® 8

Windows 8 kullanıyorsanız DNS önbelleğinizi temizlemek için aşağıdaki adımları uygulayın:

Klavyenizde WinX Menüsünü açmak için Win + X tuşlarına basın.

Komut İstemi'ne sağ tıklayın ve Yönetici Olarak Çalıştır'ı seçin.

Aşağıdaki komutu çalıştırın:

ipconfig / flushdns

Komut başarılı olursa, sistem aşağıdaki mesajı verir:

Windows IP yapılandırması, DNS Çözümleyici Önbelleğini başarıyla temizledi.

Windows® 7

Windows 7 kullanıyorsanız DNS önbelleğinizi temizlemek için aşağıdaki adımları uygulayın:

Başlat öğesini tıklayın.

Başlat menüsü arama metin kutusuna cmd girin.

Komut İstemi'ne sağ tıklayın ve Yönetici Olarak Çalıştır'ı seçin.

Aşağıdaki komutu çalıştırın:

ipconfig / flushdns

Komut başarılı olursa, sistem aşağıdaki iletiyi döndürür: Windows IP yapılandırması DNS Çözümleyici Önbelleğini başarıyla temizledi.


ipconfig /flushdnsC #?
Kiquenet

0

Bu iş parçacığına rastladım çünkü ayrıca SSL / TLS güvenli kanal oluşturulamadı hatası aldım . Benim durumumda, PowerShell'den bir Siebel yapılandırma REST API'sine erişmeye çalışıyordum Invoke-RestMethodve yukarıdaki önerilerin hiçbiri yardımcı olmadı.

Sonunda sorunumun nedeniyle karşılaştım: iletişim kurduğum sunucu, gerekli istemci sertifikası kimlik doğrulaması.

Çağrıların çalışması için, istemci sertifikasına (özel anahtar dahil) şu -Certificateparametreyi sağlamam gerekiyordu :

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.host/api/' -Certificate $Pfx -OtherParam ...

Umarım deneyimim, bu sorunun benim özel tadına sahip olan başka birine yardımcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.