web-dev-qa-db-ja.com

WebClientクラスに使用するSSLプロトコルを指定する方法

HTTPS POSTを使用してサーバーにデータを送信するアプリケーションがあります。これを行うには、System.Net.WebClientオブジェクトを使用します。データを送信する関数は次のとおりです。

    private byte[] PostNameValuePairs(string uri, NameValueCollection pairs)
    {
        byte[] response;
        String responsestring = "";
        using (WebClient client = new WebClient())
        {
            client.Headers = GetAuthenticationHeader();

            string DataSent = GetNameValueCollectionValuesString(pairs);

            try
            {
                response = client.UploadValues(uri, pairs);
                responsestring = Encoding.ASCII.GetString(response);
            }
            catch (Exception e)
            {
                responsestring = "CONNECTION ERROR: " + e.Message;
                return Encoding.ASCII.GetBytes(responsestring);
            }
            finally
            {
                _communicationLogger.LogCommunication(uri, client.Headers.ToString(), DataSent, responsestring);
            }
        }

        return response;
    }

Https://で始まるURIを渡します

これは長い間うまく機能しています。今日、次の接続エラーが発生し始めました:「基礎となる接続が閉じられました:送信時に予期しないエラーが発生しました」。サーバーの所有者とトラブ​​ルシューティングを行い、最終的に次のように絞り込みました。彼らはサーバーに変更を加えてTLS 1.0をブロックし、TLS 1.1または1.2を使用してデータを送信する必要があると述べました。

TLS 1.0の代わりにTLS 1.1または1.2を使用するために、WebClientオブジェクト(または関数の他の場所)で何を設定する必要がありますか?

違いがある場合は、.NET Framework 4.5を使用しています。

33
JoeMjr2

提案された他の質問から、次の行をコードに追加することで解決できました。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

これにより、クライアントからのTLS 1.0が無効になり、サーバーは接続を受け入れました。

これが同じ問題を抱えている他の人に役立つことを願っています。答えは他の質問と似ていますが、これが事実であると尋ねられた質問からは明らかではなかったので、これが重複しているとは感じません。

66
JoeMjr2