web-dev-qa-db-ja.com

WebClient使用時のSystem.Net.WebException:SSL / TLSのセキュリティで保護されたチャネルを作成できません

次のコードを実行すると

System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => {
    return true;
};
var webClient = new WebClient();
var s = webClient.DownloadString("https://jtlplugins.x-volution.de/api.php?apikey=yS5VS7OiG1ukiIqLzCSYuFCjeF1qSskKOQeCtVxh&do=pruefe_app&cappid=123&chardwareid=DC0D-BFEA-6F79-58DE-21E9-BA3A-B288-C46F&clizenzschluessel=123");

常にSystem.Net.WebExceptionが発生します:SSL/TLSのセキュリティで保護されたチャネルを作成できません

これを実行すると

https://jtlplugins.x-volution.de/api.php?apikey=yS5VS7OiG1ukiIqLzCSYuFCjeF1qSskKOQeCtVxh&do=pruefe_app&cappid=123&chardwareid=DC0D-BFEA-6F79-58DE-21E9-BA3A-B288-C46F&clizenzschluessel=123

たとえば、FirefoxやInternet Explorerで直接実行すると、機能して結果が返されます。

これもブラウザのように私のコードで実行されるようにするにはどうすればよいですか?

私はこの問題についてstackoverflowの他の投稿を読みました-しかしそれらは私の問題を解決していません:-(

11
BennoDual

フィドラーを閉じて(開いている場合)、次を追加すると、例外はなくなります。

ServicePointManager.Expect100Continue = true;                
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

または、少なくとも私があなたのコードをそのように試したとき、それは私のためになりました

try
{
     ServicePointManager.Expect100Continue = true;                
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

     ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

     var webClient = new WebClient();

     var s = webClient.DownloadString("https://jtlplugins.x-volution.de/api.php?apikey=yS5VS7OiG1ukiIqLzCSYuFCjeF1qSskKOQeCtVxh&do=pruefe_app&cappid=123&chardwareid=DC0D-BFEA-6F79-58DE-21E9-BA3A-B288-C46F&clizenzschluessel=123");

     MessageBox.Show("Result" + s);
}
catch(Exception ex)
{ 
  MessageBox.Show(ex.Message); 
}
  • 安全でないコードの警告-私はあなたがすでにこれを知っていると仮定していて、あなたがあなたのコードでWebExceptionを受け取った理由ではありませんが、この質問の最初の投稿に続く数十年の潜在的な将来の読者のために警告を追加します。コード:

    System.Net.ServicePointManager.ServerCertificateValidationCallback =(送信者、証明書、チェーン、エラー)=> {trueを返す; };

証明書の検証エラーは無視されるため、定義上、完全に安全ではありません。質問を参照してください C#証明書エラーを無視しますか?

24
kmcnamee

以下は、このような多くの一般的な問題を解決する継承WebClientクラスです...

using System;
using System.Net;
namespace YourProgram.Web
{
    public class WebClient : System.Net.WebClient
    {
        public WebClient()
        {
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            this.container = new CookieContainer();
        }
        public WebClient(CookieContainer container)
        {
            this.container = container;
        }

        public CookieContainer CookieContainer
        {
            get { return container; }
            set { container = value; }
        }

        private CookieContainer container = new CookieContainer();

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest r = base.GetWebRequest(address);
            var request = r as HttpWebRequest;
            if (request != null)
            {
                request.CookieContainer = container;
            }
            return r;
        }

        protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
        {
            WebResponse response = base.GetWebResponse(request, result);
            ReadCookies(response);
            return response;
        }

        protected override WebResponse GetWebResponse(WebRequest request)
        {
            WebResponse response = base.GetWebResponse(request);
            ReadCookies(response);
            return response;
        }

        private void ReadCookies(WebResponse r)
        {
            var response = r as HttpWebResponse;
            if (response != null)
            {
                CookieCollection cookies = response.Cookies;
                container.Add(cookies);
            }
        }
    }
}

楽しい...