.NET 4.5'te Varsayılan SecurityProtocol


254

Desteklenen sunucularla iletişim kurmak için varsayılan güvenlik protokolü nedir TLS 1.2? Will .NETvarsayılan olarak sunucu tarafında desteklenen en yüksek güvenlik protokolü seçmek ya da ben açıkça bu kod satırını eklemek zorunda yapın:

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Kod değişikliğinin yanı sıra bu varsayılanı değiştirmenin bir yolu var mı?

Son olarak, .NET 4.0sadece destekliyor TLS 1.0mu? yani desteklemek için istemci projelerini 4.5'e yükseltmeliyim TLS 1.2.

Motivasyonum, SSLv3sunucu tarafından desteklense bile istemci tarafında desteği kaldırmak (makine kayıt defterinde bunu devre dışı bırakmak için zaten bir powershell betiğim var) ve sunucunun desteklediği en yüksek TLS protokolünü desteklemek.

Güncelleme: baktığımızda ServicePointManagersınıf .NET 4.0I için herhangi sayılan değerleri görmek TLS 1.0ve 1.1. Her ikisinde .NET 4.0/4.5de varsayılan değer SecurityProtocolType.Tls|SecurityProtocolType.Ssl3. Umarım bu varsayılan SSLv3kayıt defterinde devre dışı bırakarak kırılmaz .

Ancak, tüm uygulamaları yükseltmem ve tüm uygulamaların tüm önyükleme kodlarına .NET 4.5açıkça eklemem gerektiğine karar verdim SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;.

Bu, çeşitli API'lere ve hizmetlere, eski sürümüne geçmemek SSLv3için en yüksek düzeyde talepte bulunacaktır TLS.

Bu yaklaşım kulağa makul mi yoksa aşırı mı geliyor? Güncellenecek birçok uygulamam var TLS 1.0ve yakın gelecekte bazı sağlayıcılar tarafından kullanımdan kaldırılabileceğini duyduğum için bunları gelecekte kanıtlamak istiyorum .

İstemciler API'lara giden istekte bulunurken, kayıt defterinde SSL3'ü devre dışı bırakmanın .NET çerçevesinde bile bir etkisi var mı? Varsayılan olarak TLS 1.1 ve 1.2'nin etkin olmadığını görüyorum, kayıt defteri aracılığıyla etkinleştirmemiz gerekiyor mu? RE http://support.microsoft.com/kb/245030 .

Biraz araştırma yaptıktan sonra, IIS (sunucu alt anahtarı) ve tarayıcılara (istemci alt anahtarı) uygulandıkları için kayıt defteri ayarlarının hiçbir etkisi olmayacağına inanıyorum.

Maalesef bu gönderi birden fazla soruya dönüştü ve ardından "belki" yanıtları geldi.



Bunun için en iyi cevabı görmek isteyenler için oylamaya göre sıralayın!
navule

1
İlgili SO Q & A: stackoverflow.com/questions/41618766/... Okuyucular bu soruyu dikkat etmelidir yaşlanma ve yeni öneriler 2020 itibariyle yerdesiniz
Hayır İade Hayır İadeler

Yanıtlar:


282

Yorum bırakanlardan bazıları, System.Net.ServicePointManager.SecurityProtocolbelirli değerlere ayarlamanın , uygulamanızın gelecekteki .NET güncellemelerinde varsayılan değerler olabilecek gelecekteki TLS sürümlerinden yararlanamayacağı anlamına geldiğini belirtti. Sabit bir protokol listesi belirtmek yerine, bildiğiniz ve önem verdiğiniz protokolleri açıp kapatabilir, diğerlerini olduğu gibi bırakabilirsiniz.

Diğer protokolleri etkilemeden TLS 1.1 ve 1.2'yi açmak için:

System.Net.ServicePointManager.SecurityProtocol |= 
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

|=Bu bayrakları başkalarını kapatmadan açmak için kullanıldığına dikkat edin .

SSL3'ü diğer protokolleri etkilemeden kapatmak için:

System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;

6
Bu gerçekten doğru cevap. Kabul edilen yanıt, geri dönüp kodunuzu güncellemediğiniz sürece uygulamanızın her zaman yeni TLS sürümlerini kapatmasını sağlar.
Connor

5
@Gertsen Hayır, bu biraz yönlü veya bu yüzden kapalıysa uygun bitleri açar. Bu bitler zaten açıksa, değişiklik olmaz.
Scott

3
Ve bunun PowerShell eşdeğeri [Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12) Invoke-RestMethod'un aynı temel .NET çerçeve kitaplıklarına dayanmasıdır.
Martin Hollingsworth

15
Kimse bu kodu nereye koyacağından bahsetmediğinden, ASP.NET MVC uygulamam için Global.asax.cs Application_Start uygulamasına başarıyla koydum. SMTP taleplerimin TLS1.2 üzerinden değil, TLS1.0 üzerinden nasıl gönderileceğini arıyordum. TLS 1.0'ı kapatmak için & = ~ SecurityProtocolType.Tls'yi de ekledim
Greg Veres

2
Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
VB'de

188

Her System.Net.ServicePointManager.SecurityProtocoliki .NET 4.0/4.5için varsayılan değerdir SecurityProtocolType.Tls|SecurityProtocolType.Ssl3.

.NET 4.0destekler TLS 1.0iken .NET 4.5destekleri kadarTLS 1.2

Ancak, bir uygulama hedefleme .NET 4.0hala destekleyebilir TLS 1.2eğer .NET 4.5aynı ortamda yüklenir. .NET 4.5üstüne yükler .NET 4.0, yerine System.dll.

Bunu, trafikte ayarlanan doğru güvenlik protokolünü gözlemleyerek ve fiddler4bir .NET 4.0projedeki numaralandırılmış değerleri elle ayarlayarak doğruladım :

ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;

Referans:

namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

Hack'i SADECE .NET 4.0kurulu bir ortamda denerseniz , istisna elde edersiniz:

İşlenmeyen Özel Durum: System.NotSupportedException: İstenen güvenlik protokolü desteklenmiyor. at System.Net.ServicePointManager.set_SecurityProtocol (SecurityProtocolType v alue)

Ancak, gelecekteki bir yama, vb. Kırabileceği için bu "hack" i tavsiye etmem. *

Bu nedenle, desteği kaldırmak için en iyi yolun SSLv3:

  1. Tüm uygulamaları şuraya yükseltin: .NET 4.5
  2. Varsayılan ve gelecekteki kanıtı geçersiz kılmak için önyükleme koduna aşağıdakileri ekleyin:

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

* Birisi bu hack yanlışsa beni düzeltir, ama ilk testlerin işe yaradığını görüyorum


6
Lütfen imperialviolet.org/2014/12/08/poodleagain.html adresine bakın. "Bu, bir AEAD şifreleme paketiyle TLS 1.2'den daha düşük olan her şeyin kriptografik olarak kırıldığını yinelemek için iyi bir an gibi görünüyor."
Neil

3
@ Mathew, kaynak kodunu görüntüleyerek ServicePointManager.csbkz. Referenceource.microsoft.com/#System/net/System/Net/…
Luke Hutton

12
İnsanların .NET 4.5varsayılanları Tls12 için talep ettiklerini görmeye devam ediyorum - ama buraya koyduğunuzda öyle değil. Size bunun için seçenek sunarSecurityProtocol
Don Cheadle

17
Çok sayıda yararlı bilgi sağladığından bu cevabı küçümsemeyeceğim, ancak sabit kodlu bir protokol sürümü uygulamak, uygulamanın en iyi şifrelemeyi kullanmasını kısıtlayacağı ve yolda güvenlik sorunlarına neden olabileceği için iyi bir fikir değildir. Kayıt defteri değişiklikleri aslında modern protokolleri desteklemek için .Net varsayılan davranışını değiştirmek için çok tercih edilir. (Ancak, kayıt defteri değişikliğinin SSL v3'ü de devre dışı bıraktığını belirtmek gerekir.)
AJ Henderson

6
FW 4.6 ve 4.7, varsayılan artık SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12başına support.microsoft.com/en-us/help/3069494/...
Ian Kemp

68

Aşağıdaki kayıt defterinde varsayılan davranışı geçersiz kılabilirsiniz:

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

ve

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

Ayrıntılar için lütfen uygulamasınaServicePointManager bakın .


Teşekkürler, bunu bilmiyordum. Test edeceğim. Ayarlamak için bir powershel komut dosyası oluşturdum: gist.github.com/lukehutton/ab80d207172a923401b1
Luke Hutton

6
Kayıt defterini değiştirmek iyi bir çözüm gibi görünmüyor. Uygulama TLS1'i desteklemek istiyorsa, uygulama bu konuda cate almalıdır. Çalışma ortamı değil. Aksi takdirde, diğer uygulamalara zarar verebilir veya uygulamanızı dağıtmak ve yükseltmekten cehennem yapabilir.
Mikhail G

13
@MikhailG tam tersi. Kayıt defteri değişikliği tercih edilen yöntemdir. SChannel, temeldeki görüşmenin bir özetini sağlar ve uygulamanızın desteklenen en yüksek güvenlik düzeyi ne olursa olsun kullanmasını istersiniz. Yapay olarak yazılımla sınırlandırmak, yeni protokoller yayınlandığında ve yazılımınız bunları kullanamadığında gelecekteki sorunlara neden olur. Yazılımda belirli bir protokolden daha iyi kullanmayı söyleme seçeneği olsaydı güzel olurdu, ancak gelecekteki sürümlerin çalışmasını engellemeden bunun için bir seçenek yok. Ancak bu değişiklikle SSL v3'ü devre dışı bıraktı ..
AJ Henderson

13
Komut satırı: reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64(ve / veya /reg:32)
Kevin Smyth

7
@MikhailG: Kayıt defterinin ayarlanması, uygulamaların eski protokolleri desteklemesini engellemez. Yalnızca varsayılanları değiştirir (şimdilik tls 1.0'ı içerir). Ayrıca, .Net 4.6 + 'daki varsayılan davranış güçlü kripto kullanmaktır; bu durumda bu kayıt defteri girdisi yalnızca güçlü kriptoyu devre dışı bırakmanın bir aracı olarak yararlı olacaktır.
Brian

51

.regUzantıya ve aşağıdaki içeriklere sahip bir metin dosyası oluşturun :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

Veya aşağıdaki kaynaktan indirin:

https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg

Yüklemek için çift tıklayın ...


3
Girdiğiniz bağlantıda SSL sertifikası sorunları var.
NathanAldenSr

Bu kayıt defteri anahtarını eklesem bile bu sorunla karşılaşıyorum. Herhangi bir fikir ?
Samidjo

@Samidjo - Hangi .NET sürümünü kullanıyorsunuz? Luke'un cevabı benimkinden çok daha fazla ayrıntıya giriyor, ancak görünüşe göre en azından .NET 4.5'in yüklü olması gerekiyor. Ayrıca, değişikliği yeni yaptıysanız uygulama havuzunu geri dönüştürmeniz gerekebilir. Bunlar bir tür tahmin, bu yüzden daha fazla ayrıntı olmadan çok daha fazla yardımcı olabilirim :)
dana

2
Bir sunucuya yakın zamanda uygulanan bir yama support.microsoft.com/en-us/help/4019114/… .net 4.5.2 uygulamamızın https REST isteklerinde başarısız olmasına neden oldu. Bu anahtarlar sorunumuzu çözdü.
Kleinux

21

Ben sadece TLS 1.2 belirttiğimde hala 1.1 aşağı müzakere edecek bulduk. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Bunu, .net 4.5 web uygulamam için Global.asax başlatma yönteminde belirttim.


2
Sunucudaki desteklenen güvenlik protokolü nedir? Ben de burada faktör ve 1.1 sunucuda son olduğuna inanıyorum. www.passionatecoder.ca
Ehsan

14
Bu, çözüm olan kod satırını nereye koyacağını bildiren tek cevap olduğu için seçildi.
jgerman

1
İstemci (örn. C # WebClient) ve Sunucu (aradığınız API sunucusu) her ikisinin de desteklediği en yüksek protokolü kullanmak için pazarlık yapar. Dolayısıyla, istemciniz TLS 1.2'yi destekliyorsa, ancak sunucu yalnızca TLS 1.1'i kullanıyorsa - İstemci TLS 1.1'i kullanır (istemcinizden TLS 1.1'i KALDIRMADIĞINIZ - bu durumda karşılıklı olarak desteklenen bir protokol bulamayabilir ve İstemci hata verecektir)
Don Cheadle

Global.asax.cs içinde System.Net kullanarak eklemek zorunda kaldım
Patrick

16

Aşağıdaki kod:

  • etkin protokolleri yazdır
  • mevcut protokolleri yazdır
  • platform destekliyorsa ve bununla başlamak için etkin değilse TLS1.2'yi etkinleştirin
  • etkinse SSL3'ü devre dışı bırak
  • sonucu yazdır

Sabitler:

  • 48, SSL3
  • 192 TLS1
  • 768 TL1,1
  • 3072 TL1.2

Diğer protokoller etkilenmeyecektir. Bu, gelecekteki protokollerle (Tls1.3, vb.) Uyumlu olmasını sağlar.

kod

// print initial status
    Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion);
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);
    Console.WriteLine("Available protocols: ");
    Boolean platformSupportsTls12 = false;
    foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) {                
        Console.WriteLine(protocol.GetHashCode());
        if (protocol.GetHashCode() == 3072){
            platformSupportsTls12 = true;
        }
    }
    Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072));    


// enable Tls12, if possible
    if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072)){
        if (platformSupportsTls12){
            Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now.");
            ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072;
        } else {
            Console.WriteLine("Platform does not supports Tls12.");
        }
    }

// disable ssl3
   if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3)) { 
      Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now.");
      // disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration.
      System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;                      
   }
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);

Çıktı

Runtime: 4.7.2114.0
Enabled protocols:   Ssl3, Tls
Available protocols: 
0
48
192
768
3072
Is Tls12 enabled: False
Platform supports Tls12, but it is not enabled. Enabling it now.
Ssl3 is enabled. Disabling it now.
Enabled protocols:   Tls, Tls12

14

Müşterim TLS'yi 1.0'dan 1.2'ye yükselttiğinde sorun yaşadım. Uygulamam .net framework 3.5 kullanıyor ve sunucuda çalışıyor. Yani ben bu şekilde sabit:

  1. Programı düzeltin

HttpWebRequest.GetResponse () öğesini çağırmadan önce şu komutu ekleyin:

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

2 yeni sınıf ekleyerek 2 DLL uzantıları: System.Net ve System.Security.Authentication

    namespace System.Net
    {
        using System.Security.Authentication;
        public static class SecurityProtocolTypeExtensions
        {
            public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
            public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11;
            public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0;
        }
    } 

    namespace System.Security.Authentication
    {
        public static class SslProtocolsExtensions
        {
            public const SslProtocols Tls12 = (SslProtocols)0x00000C00;
            public const SslProtocols Tls11 = (SslProtocols)0x00000300;
        }
    } 
  1. Microsoft toplu işini güncelle

Toplu indir:

  • Windows 2008 R2 için: windows6.1-kb3154518-x64.msu
  • Windows 2012 R2 için: windows8.1-kb3154520-x64.msu

Toplu yükleme ve daha fazla ayrıntı için burada görebilirsiniz:

https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-ve-sunucu-2008-r2-sp1


1
kodunu değiştirmeden SecurityProtocol'u değiştirmek mümkün mü? bir machine.config veya app.config gibi.
ahankendi

1
Vay. Bu yılın vudu ödülü ... stuff ... tam orada. Banliyöleri sallayın!
granadaCoder

14

Kayıt değişikliği mekanizması bir mücadeleden sonra benim için çalıştı. Aslında benim uygulama 32bit olarak çalışıyordu. Bu yüzden yol altındaki değeri değiştirmek zorunda kaldım.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319

Değer türü DWORD ve 0 değerinin üzerinde olmalıdır.Net 4.0 uygulaması almak için kayıt defteri ayarları TLS 1.2 kullanın sağlanan. Net 4.5 makinede yüklü.


Doğru değil. .NET 4.5.2 için bunun 1 (veya üstü) olarak ayarlanması gerekir; ancak .NET 4.6 için 0 olarak ayarlanmaması yeterlidir (yani ayarlanamaz).
Jirka Hanika

Oh .Net 4.6'da test yapmadım. Bulgularım blogpost'ta var joymonscode.blogspot.com/2015/08/…
Joy George Kunjikkuru

Belirttiğiniz kayıt defteri anahtarı "Wow6432Node" yazmalıdır. Herhangi bir nedenle "Düğüm" bölümünü atladınız. Yanıtınızı düzenlemeye çalıştım, ancak değişikliğim sadece 4 harf oldu, bu yüzden izin vermiyordu. : \
Jeffrey LeCours

Bu ayarın kendisini varsayılan olarak etkin hale getirmek için IIS'yi zıplatmam gerekiyordu.
Jeff Mitchell

10

.NET 4.5.2 altında çalışıyorum ve bu yanıtların hiçbirinden memnun kalmadım. TLS 1.2'yi destekleyen ve SSL3, TLS 1.0 ve TLS 1.1 olarak gören bir sistemle konuştuğumdan, hepsi bozuk ve kullanım için güvensiz olduğundan, bu protokolleri etkinleştirmek istemiyorum. .NET 4.5.2 altında, SSL3 ve TLS 1.0 protokollerinin her ikisi de varsayılan olarak etkindir ve inceleyerek kodda görebilirim ServicePointManager.SecurityProtocol. .NET 4.7 altında, yeniSystemDefaultProtokolün işletim sistemine açıkça seçilmesini sağlayan protokol modu, burada kayıt defterine veya diğer sistem yapılandırma ayarlarına güvenmenin uygun olacağını düşünüyorum. Ancak bu .NET 4.5.2 altında desteklenmiyor gibi görünüyor. İleri uyumlu kod yazma açısından, TLS 1.2 gelecekte kaçınılmaz olarak bozulduğunda veya .NET 4.7+ sürümüne yükselttiğimde ve işletim sistemine uygun bir protokol seçme konusunda daha fazla sorumluluk verdiğimde bile doğru kararları almaya devam edecek , Aşağıdaki kodu kabul ettim:

SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol;
if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11))
{
    securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
    if (securityProtocols == 0)
    {
        securityProtocols |= SecurityProtocolType.Tls12;
    }
    ServicePointManager.SecurityProtocol = securityProtocols;
}

Bu kod, bilinen bir güvenli olmayan protokol etkinleştirildiğinde algılanır ve bu durumda, bu güvenli olmayan protokolleri kaldırırız. Başka hiçbir açık protokol kalmazsa, o zamanlar .NET tarafından desteklenen tek güvenli protokol olarak TLS 1.2'yi etkinleştirmeye zorlayacağız. Bu kod ileriye dönük olarak uyumludur, çünkü gelecekte ekleneceği hakkında bilmediği yeni protokol türlerini dikkate alacak ve yeni ile de iyi oynayacaktır.SystemDefault.NET 4.7'de durum, yani gelecekte bu kodu tekrar ziyaret etmek zorunda kalmayacağım. Herhangi bir güvenlik protokolü durumunu koşulsuz olarak kodlamak yerine böyle bir yaklaşım benimsemenizi şiddetle tavsiye ederim, aksi takdirde TLS 1.2 olduğunda yeni bir güvenlik protokolüne yükseltmek için müşterinizi yeniden derlemeniz ve yeni bir sürümle değiştirmeniz gerekecektir. kaçınılmaz olarak bozulursa veya büyük olasılıkla mevcut güvensiz protokolleri sunucunuzda yıllarca açık bırakmanız gerekir ve bu da kuruluşunuzu saldırılar için bir hedef haline getirir.


1
Bu cevap en çok düşünülmüş gibi görünüyor, ancak bir şey eksik olmadıkça, TLS 1.2 kaçınılmaz olarak kırıldığında ileri uyumlu olacağından emin değilim. .NET 4.7.2 uygulamamda gördüğüm kadarıyla, SecurityProtocolType.SystemDefaultbayrak değerlendirilir 0, bu yüzden if (securityProtocols == 0)bitsel kapsayıcı veya TLS 1.2 için bayrakla kontrol etmek, "molalar" olduktan sonra bile her zaman TLS 1.2'yi içerecektir, değil mi? Burada keskin bir çekim yok. Gerçekten en iyi yolu bulmaya çalışıyorum.
Griswald_911

Bunu içerecek şekilde kodunu modifiye ettim ve işe ve ileri uyumlu olacak şekilde görünür: if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }.
Griswald_911

@ Griswald_911, 4.7.2 konsol uygulamamda benzer bir kod var ve bu satır securityProtocols |= SecurityProtocolType.Tls12;(blok olmadan) SystemDefault korumak değil, securityProtocols yalnızca TLS2 sonradan bulundu. Peki, değer SystemDefault olduğunda, hiçbir değer güncellenmemelidir? İleri uyumlu ile ilgili olarak, işletim sisteminin TLS 1.3 gibi daha yeni protokolleri etkinleştirmeye özen gösterdiğini mi düşünüyorsunuz?
Yang

@Yang - Doğru. securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the SecurityProtocolType`umum satırı bir [Flags]özniteliğe sahiptir ve SystemDefault numaralandırma değeri, 0daha önce ayarlanmış olsa bile SystemDefault değeri çıkarılır. Sonuç SevicePointManager.SecurityProtocol olarak 0 değerini veya diğer numaralandırma değerlerinin herhangi bir kombinasyonunu ayarlayabilirsiniz . SystemDefault olarak ayarlarsanız, temel olarak protokolü kendiniz belirtmeyi ve işletim sisteminin karar vermesine izin vermeyi seçersiniz.
Griswald_911

1
@Yang - Mesele şu ki, değeri SystemDefault olarak ayarladıktan sonra, uygulamanız işletim sisteminin belirttiği her şeyi kullanmalıdır - bu, Windows 10'un son sürümlerinde TLS 1.2'dir. Fikir şu ki, gelecekte TLS 1.3 olduğunda standart olarak, bu işlevselliği devralmak için uygulamanızı değiştirmeniz gerekmez. Belgelere bakın burada SystemDefault "işletim sistemi kullanımı için en iyi protokolünü seçmenize olanak verir ve güvenli olmayan protokolleri engellemek için" nerede.
Griswald_911

6

Microsoft son zamanlarda bu konuda en iyi uygulamaları yayınladı. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

özet

Net Framework 4.7'yi hedefleyin, SecurityProtocol'u ayarlayan herhangi bir kodu kaldırın, böylece işletim sistemi en güvenli çözümü kullanmanızı sağlayacaktır.

Not: Ayrıca, TLS'nin en son sürümünün işletim sisteminizde desteklendiğinden ve etkinleştirildiğinden emin olmanız gerekir.

OS                          TLS 1.2 support

Windows 10                  \_ Supported, and enabled by default.
Windows Server 2016         /   
Windows 8.1                 \_ Supported, and enabled by default.
Windows Server 2012 R2      /
Windows 8.0                 \_ Supported, and enabled by default.
Windows Server 2012         /
Windows 7 SP1               \_ Supported, but not enabled by default*.
Windows Server 2008 R2 SP1  /
Windows Server 2008         -  Support for TLS 1.2 and TLS 1.1 requires an update. See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows Vista               -  Not supported.

* To enable TLS1.2 via the registry see https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Server

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Client

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

Daha fazla bilgi ve daha eski çerçeveler için lütfen MS bağlantısına bakın.


3
Sorun, tls 1.1 ve tls 1.2, kayıt defteri değişikliği olmadan bu işletim sisteminde "etkin" (ne anlama gelirse) olmadığından (SecurityProtocolType.SystemDefault tutmak) yönergeleri izlerseniz Windows 7 ve Server 2008 üzerinde çalışmaz olmasıdır. Bu, uygulamada SystemDefault'u tasarımdan koparır. Microsoft bunu gerçekten berbat etti.
osexpert

İyi biri, teşekkürler @osexpert, iyi yakalayın. Cevabı, desteklenen işletim sistemleri hakkında bilgi içerecek şekilde değiştirdim, bu yüzden sadece 4.7'yi hedeflemenin yeterli olmadığı eski işletim sistemleri çalıştıran insanlar için sürpriz yok.
JohnLBevan

1
Not: Bazı işletim sistemlerinde daha yeni protokolleri etkinleştirmek için bir KB de vardır: support.microsoft.com/en-my/help/3140245/…
JohnLBevan

1
Kayıt defteri ayarları bir seçenek değilse, bu .NET 4.7+ için en iyi çözüm olduğunu düşünüyorum: if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
osexpert

5

Tamlık için, yukarıda belirtilen kayıt defteri anahtarlarını ayarlayan bir Powershell betiği:

new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord";
new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"

2

Sabit kodlamaya ServicePointManager.SecurityProtocolveya yukarıda belirtildiği gibi açık SchUseStrongCrypto anahtarına bir alternatif : .NET'e SystemDefaultTlsVersions anahtarıyla
varsayılan SCHANNEL ayarlarını kullanmasını söyleyebilirsiniz,
örneğin:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001

2

Bu sorunun en iyi çözümü, güçlü protokolleri ve güçlü şifreleri otomatik olarak seçecek olan en az .NET 4.6 veya daha ileri bir sürüme yükseltmek gibi görünüyor.

.NET 4.6'ya yükseltemiyorsanız,

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Ve kayıt defteri ayarlarını kullanarak:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = 1 DWORD HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD 1

TLS 1.0 ve güçlü bir şifre dışında bir şey kullanmanızla sonuçlanır.

Testlerimde, test uygulamam Herhangi Bir CPU için oluşturulmuş olsa bile, yalnızca Wow6432Node'daki ayar herhangi bir fark yarattı.


Açıklama: Yalnızca SevicePointManager.SecurityProtocol ayarlamanız VEYA kayıt defteri ayarlarını yapmanız gerekir. Her ikisini de yapmaya gerek yok. Benim uygulama için, ben sadece ServicePointManager.SecurityProtocol ayarlamak için seçti. Benim akıl yürütme kayıt defteri ayarını tüm makine etkiler ve TLS 1.0 bağlı olduğu için başkasının uygulama kırılmasını istemiyordu.
GWC

1

Göre Aktarım Katmanı Güvenliği (TLS) .NET Framework ile en iyi uygulamalar : .NET Framework uygulamaları güvenli kalmasını sağlamak için, TLS sürümü gerekir değil sabit şekilde. Bunun yerine kayıt defteri anahtarlarını ayarlayın: SystemDefaultTlsVersions ve SchUseStrongCrypto :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

0

.NET 4.7.1 veya daha yenisini kullanabiliyorsanız, işletim sistemi yeteneklerine göre minimum protokol olarak TLS 1.2'yi kullanır. Microsoft tavsiyesi uyarınca:

To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.

-2

Anahtar için: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Değer: SchUseStrongCrypto

Değeri 1 olarak ayarlamanız gerekir.


5
@Jira Mares'ın sunduğu aynı cevap, ancak daha az ayrıntıyla indirildiğini düşünüyorum
Stuart Siegler
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.