Ошибка аутентификации, так как удаленная сторона закрыла транспортный stream

Я разрабатываю TCP-клиент для подключения сервера OpenSSL с аутентификацией сертификата. У меня есть файлы .crt и .key, разделяемые командой сервера. Эти сертификаты генерируются командами OpenSSL.

Я использую объект SslStream для аутентификации клиента Tcp, вызывая метод SslStream.AuthenticateAsClient , передавая IP сервера, SslProtocols.Ssl3 и X509CertificateCollection .

Я получаю следующую ошибку:

Ошибка аутентификации, поскольку удаленная сторона закрыла транспортный stream

Пожалуйста, помогите по этой проблеме и заблаговременно.

Я бы посоветовал не ограничивать 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; 

Я столкнулся с тем же сообщением об ошибке при использовании файла ChargifyNET.dll для связи с API-интерфейсом Chargify. Добавление chargify.ProtocolType = SecurityProtocolType.Tls12; для конфигурации решена проблема для меня.

Вот полный fragment кода:

 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.

Давайте будем гением компьютера.