web-dev-qa-db-ja.com

リモートパーティがトランスポートストリームを閉じたため、内部例外認証によるHttpWebrequestでの認証に失敗しました

C#、. Net 4.5を使用して、リモートサーバー上のHttpWebRequestを介してWeb要求を送信しようとしています。以下のコードをご覧ください。いくつかのフォーラムで提案された解決策のほとんどを試しましたが、常に同じエラーが発生します。以下のスタックトレースを参照してください。 request.GetReponse()メソッドを呼び出すと、エラーがスローされます。

追加情報、基本的には、リモートサーバーにインストールされたvmwareのvCenterコンポーネントのreloadSslCertificate関数を呼び出そうとしています。現在、エラーはvCenter 5.5でのみ発生します。バージョン5.1以前では正常に動作します。

        var uri = String.Format("https://{0}/some_url", serverName);
        var request = (HttpWebRequest)WebRequest.Create(uri);
        request.KeepAlive = true;
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
        request.Credentials = credential;
        request.CookieContainer = cookieContainer;


        var response = request.GetResponse();

例外:System.Net.WebException:基になる接続が閉じられました:送信時に予期しないエラーが発生しました。 ---> System.IO.IOException:リモートパーティがトランスポートストリームを閉じたため、認証に失敗しました。 System.Net.Security.SslState.StartReadFrame(Byte [] buffer、Int32 readBytes、AsyncProtocolRequest asyncRequest)at System.Net.Security.SslState.StartReceiveBlob(Byte [] buffer、AsyncProtocolRequest asyncRequest)at System.Net.Security.SslState。 System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst、Byte [] buffer、AsyncProtocolRequest)のSystem.Net.Security.SslState.StartSendBlob(Byte [] incoming、Int32 count、AsyncProtocolRequest asyncRequest)のCheckCompletionBeforeNextReceive(ProtocolTokenメッセージ、AsyncProtocolRequest asyncRequest) asyncRequest)System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)at System.Net.TlsStream.CallProcessAuthentication(Object state)at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback callback、Object state、Boolean preserveSyncCtx) System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallbackコールバック、オブジェクト状態、ブール値preserveSy ncCtx)System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback callback、Object state)at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)at System.Net.TlsStream.Write(Byte [] buffer、Int32 offset、Int32サイズ)System.Net.PooledStream.Write(Byte []バッファー、Int32オフセット、Int32サイズ)at System.Net.ConnectStream.WriteHeaders(Boolean async)---内部例外スタックトレースの終了--- System.Net .HttpWebRequest.GetResponse()

前もって感謝します。

22
spitfyr86

この問題は既に解決されていることを共有したいと思います。

Web要求を発行する前に、セキュリティプロトコルを設定するコードの一部を変更しました。

から:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

に:

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

判明したように、vCenter 5.5はその構成でSSLプロトコルとしてTLSを使用します。これと同じ問題が発生したときに、人々がこれを参考にしてくれることを願っています。

24
spitfyr86

同じ例外に遭遇しました。私たちの場合、答えは@Dennis Lapingの答えと非常に似ていました。別のチームが、 Rancher ロードバランサー内でヒットしようとしているサービスをセットアップしました。デフォルトでは、TLS 1.0またはSSL3は許可されませんでした。 .NETの SecurityProtocol (設定なし)の現在のデフォルトでは、TLS 1.0またはSSL3のみが許可されます。

SecurityProtocol を次のように設定するとすぐに、すべて正常に機能しました。

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

つまり、 SecurityProtocol のドキュメントには次のように記載されています。

コードは、特定の保護レベルの使用に暗黙的に依存したり、デフォルトで特定のセキュリティレベルが使用されるという仮定に依存したりしないでください。アプリが特定のセキュリティレベルの使用に依存している場合、そのレベルを明示的に指定し、確立された接続で実際に使用されていることを確認する必要があります。さらに、コードは、サポートされるプロトコルの変更に直面して堅牢になるように設計する必要があります。そのような変更は、新たな脅威を軽減するために事前通知なしに行われることが多いためです。

プロトコルの状況に対する最善の解決策を再評価しますが、今のところはこれが他の人の助けになることを願っています。

17
neumann1990

このリンクを参照してください、それは私のために働いた: HttpWebRequestのようにTcpClientでHTTPSを行う方法?

Dim trust_all_certificates As New CertificateOverride
ServicePointManager.ServerCertificateValidationCallback = AddressOf trust_all_certificates.RemoteCertificateValidationCallback
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

Public Class CertificateOverride

    Public Function RemoteCertificateValidationCallback(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean

        'CertEXPIRED = 2148204801
        'CertVALIDITYPERIODNESTING = 2148204802
        'CertPATHLENCONST = 2148204804
        'CertROLE = 2148204803
        'CertCRITICAL = 2148204805
        'CertPURPOSE = 2148204806
        'CertISSUERCHAINING = 2148204807
        'CertMALFORMED = 2148204808
        'CertUNTRUSTEDROOT = 2148204809
        'CertCHAINING = 2148204810
        'CertREVOKED = 2148204812
        'CertUNTRUSTEDTESTROOT = 2148204813
        'CertREVOCATION_FAILURE = 2148204814
        'CertCN_NO_MATCH = 2148204815
        'CertWRONG_USAGE = 2148204816
        'CertUNTRUSTEDCA = 2148204818

        Return True

    End Function

End Class

追伸.

サーバー側からの証明書が受け入れられることを確認するためだけに、次のコード行を挿入しました:ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

1
MaGnumX