사용자 지정 인증서로 https 호출을 생성하는 다음 C# 코드가 있습니다. Tls 1.1을 사용하면 호출이 정상적으로 작동합니다. Tls 1.2를 사용하면 호출이 중단됩니다. tls 1.2를 사용하여 컬을 사용하여 잘 작동합니다.C# 및 dotnet 4.7.1 TLS 1.2 호출 용 사용자 지정 인증서를 추가하지 않음
는C# 코드 :
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;
작품으로 :
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
오류와 :
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
닷넷 오류 메시지 : SocketException이 : 기존의 연결이 강제로 폐쇄되었다 원격 호스트
.NET 버전 : 4.7.1
OS : 윈도우 10 버전 1,703 (지원되는 암호화 목록 : https://msdn.microsoft.com/en-us/library/windows/desktop/mt808163(v=vs.85).aspx) - 상기 서버는 지원되는 암호 사이 인 TLS_RSA_WITH_AES_256_GCM_SHA384 사용되도록 지정한다.
wireshark에서 저는 작업 호출 (C#/Tls 1.1 및 Curl Tls 1.2)에서 인증서가 서버로 전송되고 있음을 볼 수 있습니다. 다음은 C#을 TLS 1.1 전화에 대한 와이어 샤크 덤프입니다 :
그러나, 또한 와이어 샤크에서, 나는 C#을 가진 것을 볼 수가/TLS 1.2에는 인증서가 클라이언트에서 서버로 전송되지되고있다.
사람이 내가 여기에 놓친 거지 무엇을 볼 수 있습니다 여기에 C#을 TLS 1.2 전화에 대한 와이어 샤크 덤프는?
UPDATE는
은 인증서가 TLS 1.2와 함께 창에서 샤넬에 의해 지원되지 않는 MD5 서명이 보인다. 우리의 벤더가 해결책으로 우리에게 또 다른 인증서를 만들었습니다. https://community.qualys.com/thread/15498
.Net Core 2.0 클라이언트/서버 응용 프로그램과 비슷한 문제가 있습니다. 나는 서버에서 TLS 1.2를 강제로 해결했다. 이 방법은 클라이언트가 프로토콜과 인증서를 적절히 협상합니다. TLS 1.2 만 강제 실행되는 서버에 연결하려고 시도하고 .NET Framework에서 동일한 동작을하는지 확인하십시오. – Ghigo
잘 서버를이 변경하는 것은 서버가 공급 업체에 속해 있기 때문에 실제로 여기 옵션이 아닙니다. 그리고 tls 1.1을 추가해도 상관 없습니다. tls 1.2가 허용 된 프로토콜 중 하나 인 경우이 문제가 발생합니다. 왜 곱슬 곱슬하게 잘 작동하는지 .net이 이런 식으로 행동하는지 알아야합니다. 그리고 정적 인 설정이고 다른 연결은 동일한 응용 프로그램의 tls 1.2에 의존하므로 tls 1.2를 활성화해야합니다. 이 한 번의 통화로 tls 1.3을 돌릴 수 있다면 그렇게 할 수 있습니다. 그러나 핸들러 객체에 프로토콜을 설정하면 현재 env에서 이것이 불가능하다는 것을 나타내는 예외가 발생합니다. –
이 질문과 중복되는 것처럼 보입니다. https://stackoverflow.com/questions/44751179/tls-1-2-not-negotiated-in-net-4-7-without-explicit-servicepointmanager-security –