AuthenticateAsClient: System.IO.IOException: получено непредвиденное EOF или 0 байт из транспортного потока

Благодаря Heartbleed наш сервер шлюзов был обновлен, и эта проблема была представлена.

Благодаря POODLE SSLv3 больше не поддерживается.

  • Обратите внимание: проблема присутствует только в блоках Win7 +; Ящики WinXP работают без проблем (одинаковый код, другая ОС = проблема); предоставленный WinXP больше не является действующей ОС, просто хотел отметить функциональность.

Клиентское приложение (.NET 2.0) находится в окне Windows 7 (или 8). Сервер работает в DMZ за сервером шлюза. Чтобы отметить, я обнаружил, что эта проблема больше не присутствует на .NET 4.0+ - однако из-за устаревшего кода у меня нет роскоши обновления.

Сервер шлюза - это поле пропуска, на котором запущен HTTP-сервер Apache с запуском SSL. Его местоположение находится за пределами DMZ, и оно используется для доступа к Серверу, находящемуся внутри DMZ. Версии программного обеспечения, запущенного на сервере Gateway, - Apache/2.2.25 (Win32), mod_jk/1.2.39, mod_ssl/2.2.25, OpenSSL/1.0.1g

Вот код, используемый в приложении-клиенте (с непомерной суммой добавленных записей)... note, 'serverName' обычно содержит значение, такое как https://some.url.com"

private bool ConnectAndAuthenicate(string serverName, out TcpClient client, out SslStream sslStream)
{
    client = null;
    sslStream = null;
    try
    {
        client = new TcpClient(serverName, 443); // Create a TCP/IP client; ctor attempts connection
        Log("ConnectAndAuthenicate: Client CONNECTED"));

        sslStream = new SslStream(client.GetStream(), false, ValidateServerCertificate, null);
        Log("ConnectAndAuthenicate: SSL Stream CREATED"));
    }
    catch (Exception x)
    {
        Log("ConnectAndAuthenicate: EXCEPTION >> CONNECTING to server: {0}", x.ToString()));

        if (x is SocketException)
        {
            SocketException s = x as SocketException;
            Log("ConnectAndAuthenicate: EXCEPTION >> CONNECTING to server: Socket.ErrorCode: {0}", s.ErrorCode));
        }
        if (client != null) { client.Close(); client = null; }
        if (sslStream != null) { sslStream.Close(); sslStream = null; }
    }

    if (sslStream == null) return false;

    try
    {
        sslStream.ReadTimeout = 10000; // wait 10 seconds for a response ...
        Log("ConnectAndAuthenicate: AuthenticateAsClient CALLED ({0})", serverName));
        sslStream.AuthenticateAsClient(serverName);
        Log("ConnectAndAuthenicate: AuthenticateAsClient COMPLETED SUCCESSFULLY"));
        return true;
    }
    catch (Exception x)
    {
        Log("ConnectAndAuthenicate: EXCEPTION >> AuthenticateAsClient: {0}", x.ToString()));
        client.Close(); client = null;
        sslStream.Close(); sslStream = null;
    }
    return false;
}

Примечание. ответы, опубликованные, относящиеся к ServicePointManager, абсолютно не влияют на результат этого приложения.

Каждый раз, когда AuthenicateAsClient() вызывается, когда приложение запускается в поле Win 7+, возникает исключение - если приложение запускается в окне WinXP, код работает правильно без исключений.

Любые идеи для решений очень приветствуются.

Ответ 1

Следуя следующему этапу установки ServicePointManager.SecurityProtocol статического ctor с SecurityProtocolType, я обнаружил упоминание другого перечисления под названием SslPolicy - дальнейшие исследования показали, что AuthenicateAsClient имеет перегрузку, которая принимает SslPolicy в качестве аргумента.

Изменение этой строки в приведенном выше коде устраняет эту проблему:

sslStream.AuthenticateAsClient(serverName, null, SslPolicy.Tls, false);