Ошибка подключения IrcDotNet Ошибка аутентификации, поскольку удаленная сторона закрыла транспортный поток при использовании SSL - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь подключиться к серверу Irc, который выдал ошибку:

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

Код C #:

_client = new StandardIrcClient();
_ircUrl = "irc.blabla.com";
_nick = "MyNick";
_port = 7021;
_useSsl = true;
_channels = new[] { "#test" };

IrcUserRegistrationInfo info = new IrcUserRegistrationInfo
{
    NickName = _nick,
    Password = "",
    RealName = _nick,
    UserName = _nick
};

_client.RawMessageReceived += (s, ev) =>
{
    write(ev.RawContent);
    _execute(ev.RawContent);
};

_client.Connected += (s, ev) =>
{
    write("Connected");
};

_client.Registered += (s, ev) =>
{
    _log.Debug("registered");

    if (!string.IsNullOrWhiteSpace(_inviteCommand))
    {
        if (_inviteCommand.IndexOf(":invite", StringComparison.OrdinalIgnoreCase) > -1)
        {
            _client.SendRawMessage($"PRIVMSG {_inviteCommand.Replace("invite", ":invite")}");
        }
    }

    _client.Channels.Join(_channels);
};

_client.ConnectFailed += (s, ev) =>
{
    write(ev.Error.Message);
    _client.Disconnect();
};

_client.Disconnected += (s, ev) =>
{
    _log.Debug("disconnected");
    write("Disconnected");
};

_client.Error += (s, ev) =>
{
    _log.Error(ev.Error);
};

_client.ErrorMessageReceived += (s, ev) =>
{
    _log.Error(ev.Message);
};

bool useSsl = _port > 0 && _useSsl;
if (useSsl)
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
}

_client.Connect(_ircUrl, _port == 0 ? 6667 : _port, useSsl, info);

РЕДАКТИРОВАТЬ

Я использую библиотеку Net Standard , поэтому я не могу добавить SSL3, так как в нем указано, что протокол не поддерживается.

1 Ответ

0 голосов
/ 23 сентября 2019

Вы не добавили Ssl3 SecurityProtocolType.Ssl3 в SecurityProtocol.Вам также необходимо включить протокол безопасности Ssl3 в вашем приложении.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Обновление: Эта проблема возникает из-за набора по умолчанию SSL/TLS протоколов, который используется ServicePointManagerи SslStream был изменен.

Старое значение: Ssl 3.0 |Tls 1.0 |Tls 1.1

Новое значение: Tls 1.0 |Tls 1.1 |Tls 1.2

Чтобы обойти эту проблему, обновите сервер до Tls 1.0, Tls 1.1, or Tls 1.2, поскольку было показано, что SSL 3.0 небезопасен и уязвим для атак, таких как POODLE.

Примечание. Если обновление не удаетсясервер, используйте AppContext класс, чтобы отказаться от этой функции.Для этого используйте один из следующих методов:

Программно: Должно быть самое первое, что делает приложение, потому что ServicePointManager будет инициализироваться только один раз.

Используйте следующий пример кода в вашем приложении:

private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching";
        private const string DontEnableSchUseStrongCryptoName = @"Switch.System.Net.DontEnableSchUseStrongCrypto";
        AppContext.SetSwitch(DisableCachingName, true);
        AppContext.SetSwitch(DontEnableSchUseStrongCryptoName, true);

Для получения дополнительной информации: Невозможно подключиться к серверу с помощью API-интерфейсов ServicePointManager или SslStream

...