인증서 인증으로 OpenSSL 서버를 연결하는 TCP 클라이언트를 개발 중입니다. 서버 팀에서 공유하는 .crt 및 .key 파일을 사용하고 있습니다. 이러한 인증서는 OpenSSL 명령에 의해 생성됩니다.
내가 사용하고 SslStream
호출하여 TCP 클라이언트를 인증하는 개체를 SslStream.AuthenticateAsClient
서버에 전달하여 방법을 IP
, SslProtocols.Ssl3
하고 X509CertificateCollection
.
다음과 같은 오류가 발생합니다.
원격 당사자가 전송 스트림을 닫았 기 때문에 인증에 실패했습니다.
답변
SecurityProtocol을 TLS 1.1로 제한하지 않는 것이 좋습니다.
권장되는 해결책은
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
또 다른 옵션은 다음 레지스트리 키를 추가하는 것입니다.
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
.NET 4.6은 기본적으로 올바른 프로토콜을 사용하며 두 솔루션 모두 필요하지 않습니다.
답변
이전 버전의 .net을 사용하려면 고유 한 플래그를 만들고 캐스팅합니다.
//
// Summary:
// Specifies the security protocols that are supported by the Schannel security
// package.
[Flags]
private enum MySecurityProtocolType
{
//
// Summary:
// Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
Ssl3 = 48,
//
// Summary:
// Specifies the Transport Layer Security (TLS) 1.0 security protocol.
Tls = 192,
//
// Summary:
// Specifies the Transport Layer Security (TLS) 1.1 security protocol.
Tls11 = 768,
//
// Summary:
// Specifies the Transport Layer Security (TLS) 1.2 security protocol.
Tls12 = 3072
}
public Session()
{
System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls);
}
답변
아래 코드를 추가하면 문제를 극복하는 데 도움이되었습니다.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
답변
using (var client = new HttpClient(handler))
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false);
await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}
이것은 나를 위해 일했습니다.
답변
ChargifyNET.dll을 사용하여 Chargify API와 통신하는 동안 동일한 오류 메시지가 나타납니다. chargify.ProtocolType = SecurityProtocolType.Tls12;
구성에 추가 하면 문제가 해결되었습니다.
다음은 전체 코드 스 니펫입니다.
public ChargifyConnect GetChargifyConnect()
{
var chargify = new ChargifyConnect();
chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"];
chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"];
chargify.URL = ConfigurationManager.AppSettings["Chargify.url"];
// Without this an error will be thrown.
chargify.ProtocolType = SecurityProtocolType.Tls12;
return chargify;
}
답변
VB.NET의 경우 웹 요청 전에 다음을 배치 할 수 있습니다.
Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12
이것은 .NET 3.5에서 내 보안 문제를 해결했습니다.
답변
웹 요청 엔드 포인트가 TLS1.2 요청 만 허용하는 다른 서버로 전환되었을 때 이런 일이 발생했습니다. 주로 Stackoverflow에서 찾은 많은 시도를 시도했습니다.
- 레지스트리 키,
- 추가 :
System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; Global.ASX OnStart로, - Web.config에 추가되었습니다.
- .Net 프레임 워크를 4.7.2로 업데이트했지만 여전히 동일한 예외가 발생합니다.
받은 예외는 내가 직면 한 실제 문제를 정당화하지 못했고 서비스 운영자의 도움을 찾지 못했습니다.
이 문제를 해결하기 위해 새로운 Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 를 추가
해야 합니다. 아래 그림과 같이 여기 에서 IIS Crypto 2.0 Tool을 사용했습니다 .