2017-12-20 271 views
18

Ben aşağıdaki C# kodu, özel bir sertifika ile bir https çağrı inşa. Tls 1.1 kullanırken, çağrı iyi çalışıyor. Tls 1.2 kullanırken arama kesilir. Ben ince hem de TLS 1.2 eserlerini kullanarak, curl kullanarak.C# ve dotnet 4.7.1 TLS 1.2 aramalar için özel sertifika ekleme değil

C# Kod:

X509Certificate2Collection collection = new X509Certificate2Collection(); 
collection.Import("C:\\SomePath\\MyCertificate.pfx", "MyPassword", X509KeyStorageFlags.PersistKeySet); 
var cert = collection[0]; 

ServicePointManager.SecurityProtocol = ...; 

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true; 
HttpClientHandler handler = new HttpClientHandler(); 
handler.ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true; 
handler.ClientCertificates.Add(cert); 

var content = new ByteArrayContent(Encoding.GetEncoding("latin1").GetBytes("Hello world")); 
HttpClient client = new HttpClient(handler); 
var resp = client.PostAsync(requestUri: url, content: content).Result.Content.ReadAsStringAsync().Result; 

İşleri ile:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; 

Hata ile:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

Net hata iletisi: SocketException: Varolan bir bağlantıyı zorla tarafından kapatıldı uzak ana

Net sürümü: 4.7.1

OS: Windows 10 sürümü 1703 (desteklenen şifre listesi: https://msdn.microsoft.com/en-us/library/windows/desktop/mt808163(v=vs.85).aspx) - ve sunucu desteklenen şifrelerin arasında olan TLS_RSA_WITH_AES_256_GCM_SHA384 kullanılacak belirtir.

wireshark I (C#/TLS 1.1 ve Bukle TLS 1.2) sertifika sunucusu gönderiliyor çalışma aramalar görebilirsiniz. İşte C# tls 1.1 çağrı için Wireshark çöplük:

Wireshark dump - Csharp tls 1.1

Ancak aynı zamanda wireshark içinde, C# ile görebiliriz/TLS 1.2 hiçbir sertifika istemciden sunucuya gönderilen yoktur.

enter image description here

herkes burada eksik ben görebilir miyim: Burada C# tls 1.2 çağrı için Wireshark dökümü nedir?

GÜNCELLEME

sertifika tls'de 1.2 ile birlikte pencerelerde Schannel tarafından desteklenmeyen bir md5 imzası görünüyor. Bizim satıcı çözüm olarak bize başka sertifika yarattı. https://community.qualys.com/thread/15498

+0

.Net Core 2.0 istemci/sunucu uygulamasıyla benzer bir sorun yaşadım. TLS 1.2'yi sunucuya zorlayarak çözdüm. Bu şekilde, müşteri protokolü ve sertifikası uygun şekilde pazarlık eder. Yalnızca TLS 1.2'ye zorlanan bir sunucuya bağlanmayı ve .NET Framework ile aynı davranışın olup olmadığını görmeyi deneyebilirsiniz. – Ghigo

+0

Sunucuda bunu değiştirmek iyi bir seçenek değil çünkü sunucu bir satıcıya ait. Ve tls 1.1'i eklediğimde farketmez. Tls 1.2 sadece izin verilen protokoller arasında olduğu sürece, bu sorun olur. Neden bilmiyorum. Net, düzgün çalıştığı zaman, bu şekilde davranır. Ve tls 1.2 etkin olmalı çünkü bu statik bir ayardır ve diğer bağlantılar aynı uygulamada tls 1.2'ye bağlıdır. Bu tek çağrı için tls 1.3 dönüştürebilirdi. Ancak protokolleri işleyici nesnesine yerleştirmek, bu durumun şu anda mümkün olmadığını belirten bir istisna atar. –

+1

Bu sorunun bir kopyası gibi görünüyor. Https://stackoverflow.com/questions/44751179/tls-1-2-not-negotiated-in-net-4-7-without-explicit-servicepointmanager-security –

cevap

0

bu kod her zaman gözü kapalı gerçek dönerek sertifika hatası çeşit maskeleme inanıyoruz:

Sana bir işleve sahip tavsiye

Sorunu ele alındığı bu rastgele iplik geldi arg4'ün sonuçlarını gerçekten analiz etmek. SSL politika hataları budur. Onları kaydet ve cevabını alacaksın. Örneğimde konsola yazıyorum, ancak ize veya bir dosyaya yazabilirsiniz. Sen SslPolicyErrors numaralandırma için bir değer ilişkilendirilecek bir sayı elde edersiniz. Sonuçlara dayanarak arg3'ünüzü kontrol etmeniz gerekebilir, bu sizin zincirinizdir.

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

SslPolicyErrors errs = sslPolicyErrors; 
Console.WriteLine("Policy Errors " + sslPolicyErrors.ToString());   
return true;}; 
+0

Öncelikle yorumunuz için teşekkürler! Ancak, geri arama işlevi asla çağrılmaz. Sadece bir breakpoint ve bir konsol yazarak işleve bir beden ekledim ve bunlardan hiçbiri vurulmadı. –

+0

Ctznkane aslında, tls 1.2 kullanırken çağrılmasa bile, aslında tls 1.1 kullanırken çağrılır ve "System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors" hata türünü belirtir. Yöntem true olarak geri döner, tls 1.1'deki çağrıya izin verir, ancak daha yüksek güvenlik standartları nedeniyle tls 1.2 buna izin vermeyebilir mi? En iyi bahsettiğim, zincir hatalarının neden tls 1.1 ile birlikte oluştuğunu bulmak ve sonra hatayı düzeltmek ve tls 1.2 ile tekrar denemek. Sonuçla geri döneceğim. –

+0

Geri arama yöntemi için önerilen nesnelerde biraz kazandıktan sonra, bu iletiyi aşağıdan aşağıya buldum: "Bir sertifika zinciri işlendi, ancak güven sağlayıcısı tarafından güvenilmeyen bir kök sertifikasında sonlandırıldı." - Özellikle bu hata için google'a gideceğim. –

0

İşleyici SslProtocols özelliği belirtilmemiş midir?Bu sorunun kök nedenine haklısın

handler.SslProtocols = SslProtocols.Tls12; 
1

: Varsayılan olarak, Schannel tabanlı istemciler Win10/Server SHA1, SHA256, SHA384 ve SHA512 (sunuyoruz hander tanımından sonra bu satırı ekleyerek

deneyin 2016). Bu yüzden TLS 1.2 sunucularının MD5 sertifikalarını bu istemcilere göndermemeleri gerekiyor.

İstemci (HttpClient), MD5'ü signature_algorithms uzantısında listelemez, bu nedenle TLS 1.2 tokalaşması başarısız olur. Düzeltme güvenli bir sunucu sertifikası kullanmaktır.