web-dev-qa-db-ja.com

AuthenticateAsClient:System.IO.IOException:トランスポートストリームから予期しないEOFまたは0バイトを受信しました

Heartbleed が原因で、ゲートウェイサーバーが更新され、この問題が発生しました。

[〜#〜] poodle [〜#〜] のため、SSLv3はサポートされなくなりました。

  • この問題はWin7 +ボックスにのみ存在することに注意してください。 WinXPボックスは問題なく動作します(同じコード、異なるOS =問題)。付与されたWinXPはもはや有効なOSではなく、機能をメモしたかっただけです。

クライアントアプリケーション(.NET 2.0)は、Windows 7(または8)ボックスにあります。サーバーはゲートウェイサーバーの背後にあるDMZ更新の。

ゲートウェイサーバーは、SSLを使用するApacheHTTPサーバーが実行されるパススルーボックスです。その場所はDMZの外側にあり、DMZの内側にあるサーバーにアクセスするために使用されます。ゲートウェイサーバーで実行されているソフトウェアのバージョンは、Apache/2.2.25(Win32)、mod_jk/1.2.39、mod_ssl/2.2.25、OpenSSL /1.0.1gです。

これは、クライアントアプリケーションで使用されるコードです(膨大な量のログが追加されています)...注:「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に関連するものは、このアプリケーションの結果にまったく影響しません。

アプリケーションがWin7 +ボックスで実行されているときにAuthenicateAsClient()が呼び出されるたびに、例外が発生します。アプリケーションがWinXPボックスで実行されている場合、コードは例外なく正しく機能します。

ソリューションのアイデアは大歓迎です。

10
Bret

ServicePointManager.SecurityProtocol static ctorを SecurityProtocolType で設定した後、SslPolicyと呼ばれる別の列挙型についての言及が見つかりました-さらなる調査により、 AuthenicateAsClientにはオーバーロード SslPolicyを引数として取ります。

上記のコードでこの行を変更すると、この問題が修正されました。

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