web-dev-qa-db-ja.com

httpsURLからファイルをダウンロードする際のWebClientエラー

Https URLからxmlファイルをダウンロードしようとしています( https://nvd.nist.gov/download/nvd-rss.xml

このURLはブラウザからオープンにアクセスできます。

コンソールプロジェクトでC#Webclientを使用する。

しかし、以下のように例外を取得します

    using (WebClient client = new WebClient())
    {
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
            client.DownloadFile(uri, @"c:\test\nvd-rss.xml");
    }

$ exception {"基になる接続が閉じられました:送信時に予期しないエラーが発生しました。"} System.Net.WebException

SSLなどのすべてのプロパティをsystem.Netに追加しようとしましたが、役に立ちませんでした。

5
Pradeep H

その理由は、問題のサイトがTLS1.2のみをサポートしているためです。 .NETでは、System.Net.ServicePointManager.SecurityProtocolのデフォルト値はSsl |です。 Tlsは、デフォルトで.NETクライアントがTls 1.2をサポートしないことを意味します(SSLネゴシエーション中にサポートされるプロトコルのリストにこのプロトコルがリストされません)。少なくとも、これは多くの.NET Frameworkバージョンに当てはまりますが、すべてかどうかはわかりません。しかし、.NETは実際にはTLS 1.2をサポートしており、それを有効にするには、次のようにする必要があります。

string uri = "https://nvd.nist.gov/download/nvd-rss.xml";
using (WebClient client = new WebClient())
{
     System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
     client.DownloadFile(uri, @"c:\test\nvd-rss.xml");
}

そして、あなたは大丈夫なはずです。もちろん、System.Net.SecurityProtocolTypeはグローバル設定であり、すべてのサイトがTLS 1.2をサポートしているわけではないため、複数のTLS1.2プロトコルをサポートすることをお勧めします。

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
19
Evk

これで試してください:

using (HttpClient client = new HttpClient())
{
      var response = await client.GetAsync("https://nvd.nist.gov/download/nvd-rss.xml");

      string xml = await response.Content.ReadAsStringAsync();
      //or as byte array if needed
      var xmlByteArray = await response.Content.ReadAsByteArrayAsync();
      //or as stream
      var xmlStream = await  response.Content.ReadAsStreamAsync();

      //write to file
       File.WriteAllBytes(@"c:\temp\test.xml", xmlByteArray)

 }
1
Robert

.NET4.0。 TLS 1.2はサポートされていませんが、システムに.NET 4.5(またはそれ以降)がインストールされている場合は、アプリケーションフレームワークがTLS 1.2をサポートしていなくても、TLS1.2をオプトインできます。唯一の問題は、.NET 4.0のSecurityProtocolTypeにTLS1.2のエントリがないため、この列挙値の数値表現を使用する必要があることです。

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
1
ah pourhaji