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

최대 지원 서버와 통신하기위한 기본 보안 프로토콜은 무엇입니까 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 (서버 하위 키) 및 브라우저 (클라이언트 하위 키)에 적용되므로 영향을 미치지 않습니다.

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



답변

의견을 남기는 사람들 중 일부는 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;


답변

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;

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


답변

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

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 참조하십시오 .


답변

.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

두 번 클릭하여 설치 …


답변

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

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


답변

다음 코드는 :

  • 인쇄 가능 프로토콜
  • 사용 가능한 프로토콜 인쇄
  • 플랫폼에서 지원하고 시작으로 활성화되지 않은 경우 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


답변

고객이 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