.NET 4.5의 기본 보안 프로토콜


253

최대 지원 서버와 통신하기위한 기본 보안 프로토콜은 무엇입니까 TLS 1.2? 윌 .NET기본적으로 서버 측에서 지원하는 최고 보안 프로토콜을 선택하거나 내가 명시 적으로이 코드 줄을 추가해야합니까 :

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

코드 변경 외에이 기본값을 변경하는 방법이 있습니까?

마지막으로 .NET 4.0최대 TLS 1.0? 즉, 지원하려면 클라이언트 프로젝트를 4.5로 업그레이드해야합니다 TLS 1.2.

내 동기는 SSLv3서버가 지원하더라도 클라이언트 측에 대한 지원을 제거 하고 (시스템 레지스트리 에서이 기능을 비활성화하는 powershell 스크립트가 있음) 서버가 지원하는 가장 높은 TLS 프로토콜을 지원하는 것입니다.

업데이트 :ServicePointManager 클래스를 보면 및에 .NET 4.0대한 열거 값이 표시되지 않습니다 . 둘 다 기본값은 입니다. 레지스트리에서 비활성화해도이 기본값이 깨지지 않기를 바랍니다 .TLS 1.01.1.NET 4.0/4.5SecurityProtocolType.Tls|SecurityProtocolType.Ssl3SSLv3

그러나 모든 응용 프로그램의 모든 부트 스트랩 코드로 모든 응용 프로그램 을 업그레이드 .NET 4.5하고 명시 적으로 추가 해야한다고 결정했습니다 SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;.

이렇게하면 다양한 API 및 서비스에 대한 아웃 바운드 요청이 다운 그레이드되지 않고 SSLv3최고 수준을 선택해야합니다 TLS.

이 접근 방식이 합리적이거나 과도하게 들립니까? 업데이트 할 응용 프로그램이 많으며 TLS 1.0가까운 장래에 일부 공급자가 더 이상 사용하지 않을 수 있다고 들었으므로 향후 증명하고 싶습니다 .

클라이언트가 API에 대한 아웃 바운드 요청을 할 때 레지스트리에서 SSL3을 비활성화하면 .NET 프레임 워크에도 영향을 미치나요? 기본적으로 TLS 1.1 및 1.2는 활성화되어 있지 않습니다. 레지스트리를 통해 활성화해야합니까? RE http://support.microsoft.com/kb/245030 .

약간의 조사 후에 레지스트리 설정이 IIS (서버 하위 키) 및 브라우저 (클라이언트 하위 키)에 적용되므로 영향을 미치지 않습니다.

죄송합니다.이 게시물은 여러 개의 질문으로 바뀌 었으며 "아마도"답변이 이어졌습니다.



이에 대한 최상의 답변을 원하는 사람들을 위해 투표별로 정렬하십시오!
navule

1
관련 SO Q & A : stackoverflow.com/questions/41618766/… 독자들은이 질문이 고령화되어 2020 년 현재 새로운 권장 사항이 적용됨에 주목해야합니다.
환불 안 됨 반환 없음 반환 없음

답변:


280

의견을 남기는 사람들 중 일부는 System.Net.ServicePointManager.SecurityProtocol특정 값으로 설정 하면 앱이 향후 .NET 업데이트에서 기본값이 될 수있는 향후 TLS 버전을 이용할 수 없음을 의미합니다. 고정 된 프로토콜 목록을 지정하는 대신 알고 있고 관심이있는 프로토콜을 켜거나 끄고 다른 프로토콜은 그대로 둡니다.

다른 프로토콜에 영향을주지 않고 TLS 1.1 및 1.2를 켜려면

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

사용주의 |=다른 사람을 끄지 않고 이러한 플래그을 설정하는합니다.

다른 프로토콜에 영향을주지 않고 SSL3을 끄려면 :

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

6
이것이 실제로 정답입니다. 수락 된 답변을 통해 코드를 업데이트하지 않으면 앱에서 항상 새로운 TLS 버전을 끌 수 있습니다.
Connor

5
@Gertsen 아니요, 비트 단위이거나 적절한 비트가 꺼져 있으면 켜집니다. 해당 비트가 이미 켜져 있으면 변경이 발생하지 않습니다.
Scott

3
그리고 이것과 동등한 PowerShell은 [Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12) Invoke-RestMethod가 동일한 기본 .NET 프레임 워크 라이브러리에 의존합니다.
Martin Hollingsworth 1

15
아무도이 코드를 어디에 두어야하는지 이야기하지 않기 때문에 ASP.NET MVC 응용 프로그램을 위해 Global.asax.cs의 Application_Start에 성공적으로 넣었습니다. SMTP 요청을 TLS1.2가 아닌 TLS1.0을 통해 전송하는 방법을 찾고있었습니다. 또한 TLS 1.0을 해제하기 위해 & = ~ SecurityProtocolType.Tls를 추가했습니다.
Greg Veres

2
VB에서 이에 상응하는 것은Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Codespaced

188

System.Net.ServicePointManager.SecurityProtocol두 .NET 의 기본값 4.0/4.5SecurityProtocolType.Tls|SecurityProtocolType.Ssl3입니다.

.NET 4.0최대 지원하는 TLS 1.0동안 .NET 4.5최대 지원하는TLS 1.2

그러나 응용 프로그램 타겟팅 .NET 4.0은 동일한 환경에 설치된 TLS 1.2경우 에도 계속 지원할 수 .NET 4.5있습니다. .NET 4.5.NET 4.0대신하여 설치합니다 System.dll.

트래픽에 설정된 올바른 보안 프로토콜을 관찰하고 프로젝트 fiddler4에서 열거 된 값을 수동으로 설정하여이를 확인 .NET 4.0했습니다.

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

참고:

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

ONLY 만 .NET 4.0설치된 환경에서 해킹을 시도 하면 예외가 발생합니다.

처리되지 않은 예외 : System.NotSupportedException : 요청한 보안 프로토콜이 지원되지 않습니다. System.Net.ServicePointManager.set_SecurityProtocol (SecurityProtocolType v alue)에서

그러나 향후 패치 등으로 인해 문제가 발생할 수 있으므로이 "해킹"을 권장하지 않습니다. *

따라서 지원을 제거하는 가장 좋은 방법 SSLv3은 다음과 같습니다.

  1. 모든 응용 프로그램을 .NET 4.5
  2. 부스트 랩핑 코드에 다음을 추가하여 기본 및 향후 증거를 무시하십시오.

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

*이 해킹이 잘못되면 누군가가 나를 수정하지만 초기 테스트에서 작동하는 것으로 보입니다.


6
imperialviolet.org/2014/12/08/poodleagain.html을 참조하십시오 . "AEAD 암호 제품군을 사용하는 TLS 1.2 미만의 모든 것이 암호화 적으로 손상되었다는 점을 다시 한 번 밝히는 좋은 순간 인 것 같습니다."
Neil

3
@Mathew, 참조 sourcesource.microsoft.com/#System/net/System/Net/…을 ServicePointManager.cs참조하십시오.
Luke Hutton

12
사람들이 .NET 4.5기본값을 Tls12로 주장하는 것을 계속 보았습니다. 그러나 여기에 넣었을 때 그렇지 않습니다. 그것은 당신에게 그것을 사용하는 옵션을 제공합니다SecurityProtocol
Don Cheadle

17
유용한 답변을 많이 제공하기 때문에이 답변을 무시하지는 않지만 하드 코딩 된 프로토콜 버전을 구현하는 것은 응용 프로그램에서 사용 가능한 최상의 암호화를 사용하지 못하게하고 보안 문제를 일으킬 수 있으므로 좋지 않습니다. 최신 프로토콜을 실제로 지원하기 위해 .Net의 기본 동작을 변경하도록 레지스트리를 변경하는 것이 매우 바람직합니다. (그러나 레지스트리 변경에 주목하면 SSL v3도 비활성화됩니다.)
AJ Henderson

6
FW 4.6 및 4.7에서 기본은 지금 SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12support.microsoft.com/en-us/help/3069494/...
이안 켐프

68

다음 레지스트리에서 기본 동작을 무시할 수 있습니다.

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

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

자세한 내용은의 구현을ServicePointManager 참조하십시오 .


고마워, 나는 이것에 대해 몰랐다. 테스트하겠습니다. 나는 그것을 설정하기 위해 powershel 스크립트를 만들었습니다 : gist.github.com/lukehutton/ab80d207172a923401b1
Luke Hutton

6
레지스트리 변경은 좋은 해결책으로 보이지 않습니다. 응용 프로그램이 TLS1을 지원하려는 경우 응용 프로그램에서이를 처리해야합니다. 실행 환경이 아닙니다. 그렇지 않으면 다른 응용 프로그램이 손상되거나 응용 프로그램을 배포 및 업그레이드하지 못할 수도 있습니다.
Mikhail G

13
@MikhailG는 정반대입니다. 레지스트리 변경이 선호되는 방법입니다. SChannel은 기본 협상의 추상화를 제공하며 응용 프로그램에서 지원되는 최고 보안 수준에 관계없이 사용하기를 원합니다. 소프트웨어에서 인위적으로 제한하면 새로운 프로토콜이 출시되어 소프트웨어에서 사용할 수없는 경우 향후 문제가 발생합니다. 소프트웨어에서 주어진 프로토콜보다 더 잘 사용한다고 말할 수있는 옵션이 있다면 좋을 것입니다. 그러나 향후 버전이 작동하지 못하게하지 않으면 해당 옵션이 없습니다. 이 변경으로 SSL v3을 비활성화했습니다.
AJ Henderson

13
명령 줄 : reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64(및 / 또는 /reg:32)
Kevin Smyth

7
@MikhailG : 레지스트리를 설정해도 응용 프로그램이 이전 프로토콜을 지원하는 것을 막을 수는 없습니다. 기본값 만 변경합니다 (현재 tls 1.0 포함). 또한 .Net 4.6+의 기본 동작은 강력한 암호화를 사용하는 것입니다. 이 경우이 레지스트리 항목은 강력한 암호화를 비활성화하는 수단으로 만 유용합니다.
Brian

51

.reg확장자와 다음 내용 으로 텍스트 파일을 작성하십시오 .

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

또는 다음 소스에서 다운로드하십시오.

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

두 번 클릭하여 설치 ...


3
제공하신 링크에 SSL 인증서 문제가있는 것 같습니다.
NathanAldenSr

이 레지스트리 키를 추가해도 여전히 문제가 있습니다. 어떤 아이디어?
Samidjo

@Samidjo-사용중인 .NET 버전은 무엇입니까? Luke의 대답은 내 것보다 훨씬 자세히 설명되어 있지만 적어도 .NET 4.5가 설치되어 있어야합니다. 또한 방금 변경 한 경우 앱 풀을 재활용해야 할 수도 있습니다. 이것들은 일종의 추측이므로 더 자세하게 설명하지 않으면 더 도움이 될 것입니다 :)
dana

2
최근에 서버에 적용된 support.microsoft.com/en-us/help/4019114/… 패치 는 .net 4.5.2 응용 프로그램이 https REST 요청에서 실패하도록했습니다. 이 열쇠는 우리의 문제를 해결했습니다.
Kleinux

21

TLS 1.2 만 지정하면 여전히 1.1로 다운 협상한다는 것을 알았습니다. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

내 .net 4.5 웹 응용 프로그램의 Global.asax 시작 방법에서 이것을 지정했습니다.


2
서버에서 지원되는 보안 프로토콜은 무엇입니까? 나는 이것이 또한 여기 요소이며 1.1은 서버의 최신 버전이라고 생각합니다. www.passionatecoder.ca
Ehsan

14
이것이 해결책 인 코드 줄을 어디에 넣을 것인지를 나타내는 유일한 대답이기 때문에 공감되었습니다.
jgerman

1
클라이언트 (예 : C # WebClient)와 서버 (호출중인 API 서버)는 둘 다 지원하는 최고 프로토콜을 사용하도록 협상합니다. 따라서 클라이언트가 TLS 1.2를 지원하지만 서버 만 TLS 1.1 만 사용하는 경우 클라이언트는 TLS 1.1을 사용합니다 (클라이언트에서 TLS 1.1을 제거하지 않는 한-상호 지원되는 프로토콜을 찾지 못하고 클라이언트는 오류가 발생 함)
Don Cheadle

global.asax.cs에서 System.Net을 사용하여 추가해야 함
Patrick

16

다음 코드는 :

  • 인쇄 가능 프로토콜
  • 사용 가능한 프로토콜 인쇄
  • 플랫폼에서 지원하고 시작으로 활성화되지 않은 경우 TLS1.2를 활성화하십시오.
  • 활성화 된 경우 SSL3 비활성화
  • 최종 결과 인쇄

상수 :

  • 48은 SSL3입니다
  • 192는 TLS1입니다
  • 768은 TLS1.1입니다
  • 3072는 TLS1.2입니다

다른 프로토콜은 영향을받지 않습니다. 이는 향후 프로토콜 (Tls1.3 등)과 호환됩니다.

암호

// 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);

산출

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

고객이 TLS를 1.0에서 1.2로 업그레이드 할 때 문제가 발생했습니다. 내 응용 프로그램은 .net framework 3.5를 사용하고 서버에서 실행됩니다. 그래서 나는 이것을 이런 식으로 고쳤다.

  1. 프로그램 수정

HttpWebRequest.GetResponse ()를 호출하기 전에 다음 명령을 추가하십시오.

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

System.Net 및 System.Security.Authentication이라는 두 개의 새 클래스를 추가하여 확장 2 DLL

    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 배치 업데이트

배치 다운로드 :

  • Windows 2008 R2의 경우 : windows6.1-kb3154518-x64.msu
  • Windows 2012 R2의 경우 : windows8.1-kb3154520-x64.msu

일괄 다운로드 및 자세한 내용은 여기를 참조하십시오.

https://support.microsoft.com/ko-kr/help/3154518/support-for-tls-system-default-versions-included-in-the-.-net-framework-3.5.1-on-windows-7 -sp1- 및 서버 -2008-r2-sp1


1
소스 코드를 변경하지 않고 SecurityProtocol을 변경할 수 있습니까? machine.config 또는 app.config와 같습니다.
ahankendi

1
와. 그것은 올해의 상입니다. 당신은 교외를 흔들어!
granadaCoder

14

레지스트리 변경 메커니즘은 투쟁 후에 나를 위해 일했습니다. 실제로 내 응용 프로그램은 32 비트로 실행되었습니다. 그래서 경로 아래에서 값을 변경해야했습니다.

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

값 유형은 DWORD이고 0보다 큰 값이어야합니다..Net 4.0 앱을 사용하기위한 레지스트리 설정은 TLS 1.2를 제공합니다.


정확하지 않습니다. .NET 4.5.2의 경우이 값을 1 이상으로 설정해야합니다. 그러나 .NET 4.6의 경우 0으로 설정하지 않아도됩니다 (즉, 설정 해제 할 수 있음).
Jirka Hanika

아 .Net 4.6에서 테스트하지 않았습니다. 내 발견은 blogpost joymonscode.blogspot.com/2015/08/…에 있습니다
Joy George Kunjikkuru

언급 한 레지스트리 키는 "Wow6432Node"여야합니다. 어떤 이유로 "노드"부분을 생략했습니다. 귀하의 답변을 수정하려고했으나 변경 한 내용이 4 글자 밖에되지 않아서 알려 드릴 수 없었습니다. : \
Jeffrey LeCours

이 설정을 기본값으로 활성화하려면 IIS를 반송해야했습니다.
Jeff Mitchell

10

.NET 4.5.2에서 실행 중이며 이러한 답변에 만족하지 않았습니다. TLS 1.2를 지원하는 시스템과 대화하고 SSL3, TLS 1.0 및 TLS 1.1이 모두 손상되어 사용하기에 안전하지 않기 때문에 이러한 프로토콜을 사용하고 싶지 않습니다. .NET 4.5.2에서 SSL3 및 TLS 1.0 프로토콜은 모두 기본적으로 사용하도록 설정되어 있으며 코드를 통해 확인할 수 있습니다 ServicePointManager.SecurityProtocol. .NET 4.7에는 새로운 기능이 있습니다.SystemDefault프로토콜 선택을 OS에 명시 적으로 전달하는 프로토콜 모드. 레지스트리 또는 기타 시스템 구성 설정에 의존하는 것이 적절하다고 생각합니다. 그러나 .NET 4.5.2에서는 지원되지 않는 것 같습니다. 앞으로 호환되는 코드를 작성하려면 TLS 1.2가 미래에 불가피하게 중단되거나 .NET 4.7+로 업그레이드하고 OS에 적합한 프로토콜을 선택하는 데 더 많은 책임을 맡길 때에도 올바른 결정을 내릴 것입니다. 다음 코드를 채택했습니다.

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;
}

이 코드는 알려진 비보안 프로토콜이 활성화 된시기를 감지하고이 경우 비보안 프로토콜을 제거합니다. 다른 명시 적 프로토콜이 남아 있지 않으면이 시점에서 .NET이 지원하는 유일한 보안 프로토콜로 TLS 1.2를 강제로 활성화합니다. 이 코드는 앞으로 추가 될 것이라는 것을 모르는 새로운 프로토콜 유형을 고려할 것이므로 앞으로 호환됩니다.SystemDefault.NET 4.7의 상태이므로 향후이 코드를 다시 방문 할 필요가 없습니다. 특정 보안 프로토콜 상태를 무조건 하드 코딩하는 대신 이와 같은 접근 방식을 채택 할 것을 강력히 권장합니다. 필연적으로 깨지거나 서버에서 기존의 안전하지 않은 프로토콜을 몇 년 동안 켜 두어 조직을 공격의 대상으로 삼아야 할 가능성이 높습니다.


1
이 답변은 가장 생각했던 것처럼 보이지만, 뭔가 빠진 경우가 아니면 TLS 1.2가 필연적으로 중단 될 때마다 앞으로 호환 될지 확실하지 않습니다. .NET 4.7.2 앱에서보고있는 것에서 SecurityProtocolType.SystemDefault플래그는로 평가 0되므로 if (securityProtocols == 0)TLS 1.2에 대해 비트 단위 또는 플래그로 검사 하면 "중단"이후에도 항상 TLS 1.2가 포함됩니까? 여기서 날카로운 촬영이 아닙니다. 진심으로 최선의 길을 찾으려고 노력하고 있습니다.
Griswald_911

이것을 포함하도록 코드를 수정했으며 작동하고 호환됩니다 if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }.
Griswald_911

@ Griswald_911, 4.7.2 콘솔 응용 프로그램에 비슷한 코드가 있으며이 줄 securityProtocols |= SecurityProtocolType.Tls12;(블록 이 없는 경우)이 SystemDefault를 유지하지 못한다는 것을 알았습니다. 보안 프로토콜에는 나중에 TLS2 만 있습니다. 따라서 값이 SystemDefault 인 경우 값을 업데이트하지 않아야 함을 의미합니까? 순방향 호환과 관련하여 OS에서 TLS 1.3과 같은 최신 프로토콜을 활성화한다고 가정합니까?

@ 양-맞습니다. securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the SecurityProtocolType` enum 행 에는 [Flags]속성이 있으며 SystemDefault 열거 형 값은입니다 0. SystemDefault 값은 이전에 설정되어 있어도 제거됩니다. 결과적 SevicePointManager.SecurityProtocol 으로 0을 설정 하거나 다른 열거 형 값의 조합으로 설정할 수 있습니다 . SystemDefault로 설정하면 기본적으로 프로토콜을 직접 지정하지 않고 OS가 결정하도록합니다.
Griswald_911 2016

1
@Yang-요점은 값을 SystemDefault로 설정 한 후 앱이 OS가 지정하는 모든 것을 사용해야한다는 것입니다. 최신 버전의 Windows 10에서는 TLS 1.2입니다 .TLS 1.3이되면 미래에 기본적으로 해당 기능을 상속하기 위해 응용 프로그램을 수정하지 않아도됩니다. 설명서를 참조하십시오 여기 SystemDefault는 "운영 체제가 사용하는 가장 프로토콜을 선택할 수 있도록하고, 안전하지 않은 프로토콜을 차단하는"곳.
Griswald_911

6

Microsoft는 최근이 문제에 대한 모범 사례를 발표했습니다. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

요약

.Net Framework 4.7을 대상으로하고 SecurityProtocol을 설정하는 코드를 제거하면 OS가 가장 안전한 솔루션을 사용할 수 있습니다.

NB : 또한 최신 버전의 TLS가 OS에서 지원되고 활성화되어 있는지 확인해야합니다.

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

자세한 정보 및 이전 프레임 워크는 MS 링크를 참조하십시오.


3
문제는 tls 1.1 및 tls 1.2가 레지스트리 변경없이 "os"에서 "사용"되지 않기 때문에 (SecurityProtocolType.SystemDefault 유지) 지침을 따르는 경우 Windows 7 및 Server 2008에서 작동하지 않는다는 것입니다. 이로 인해 SystemDefault는 실제로 의도적으로 손상됩니다. 마이크로 소프트는 이것을 정말로 망쳤다.
osexpert

감사합니다. @osexpert, 잘 잡았습니다. 지원되는 OS에 대한 정보를 포함하도록 답변을 수정 했으므로 4.7을 타겟팅하는 것만으로는 충분하지 않은 구형 OS를 사용하는 사람들에게는 놀라운 일이 없습니다.
JohnLBevan

1
NB : 일부 OS에서 최신 프로토콜을 사용할 수있는 KB도 있습니다. support.microsoft.com/en-my/help/3140245/…
JohnLBevan

1
레지스트리 설정이 옵션이 아닌 경우 이것이 .NET 4.7+에 가장 적합한 솔루션이라고 생각합니다. 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

완성도를 높이기 위해 위에서 언급 한 레지스트리 키를 설정하는 Powershell 스크립트는 다음과 같습니다.

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

위에서 언급 한 하드 코딩 ServicePointManager.SecurityProtocol또는 명시 적 SchUseStrongCrypto 키에 대한 대안 :
.NET에 SystemDefaultTlsVersions 키와 함께 기본 SCHANNEL 설정을 사용하도록 지시 할 수 있습니다
.

[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

이 문제에 대한 최선의 해결책은 최소한 .NET 4.6 이상으로 업그레이드하는 것 같습니다. 강력한 암호뿐만 아니라 강력한 프로토콜도 자동으로 선택합니다.

.NET 4.6으로 업그레이드 할 수없는 경우 설정에 대한 조언

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

레지스트리 설정 사용

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

TLS 1.0 이외의 강력한 암호를 사용합니다.

필자의 테스트에서는 테스트 응용 프로그램이 모든 CPU 용으로 구축되었지만 Wow6432Node의 설정 만 차이가있었습니다.


설명 : SevicePointManager.SecurityProtocol 만 설정하거나 레지스트리 설정을 지정하면됩니다. 둘 다 할 필요는 없습니다. 내 응용 프로그램의 경우 ServicePointManager.SecurityProtocol을 설정하기로 선택했습니다. 레지스트리를 설정하면 전체 시스템에 영향을 미치며 TLS 1.0에 의존하기 때문에 다른 사람의 응용 프로그램이 중단되는 것을 원하지 않습니다.
GWC

1

에 따르면 전송 계층 보안 (TLS)은 .NET 프레임 워크 우수 사례 것은 : .NET Framework 응용 프로그램의 보안을 유지 보장하기 위해, TLS 버전은해야 하지 하드 코딩. 대신 레지스트리 키를 설정 : SystemDefaultTlsVersions 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 이상을 사용할 수 있으면 운영 체제 기능을 기반으로 최소 프로토콜로 TLS 1.2를 사용합니다. Microsoft 권장 사항에 따라 :

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

키의 경우 : HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 값 : SchUseStrongCrypto

값을 1로 설정해야합니다.


5
나는 그것의 같은 대답 @Jira의 Mares가 제공 때문에 미만 세부 사항,을 downvoted지고 있다고 생각
스튜어트 Siegler을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.