it-swarm.com.ru

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

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

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

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

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

53
Odelu

Я бы посоветовал не ограничивать 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 будет использовать правильный протокол по умолчанию и не требует ни одного решения.

101
GuiSim

Если вы хотите использовать более старую версию .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);
    }
15
Iguanaware

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
12
muruge

Я столкнулся с тем же сообщением об ошибке при использовании ChargifyNET.dll для связи с API Chargify. Добавление 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;
}
5
Tod Birdsall

Для VB.NET вы можете разместить перед веб-запросом следующее:

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

Это решило мою проблему безопасности в .NET 3.5.

1
user1477388
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);
            }

Это сработало для меня

0
Sanket Sonavane