System.Net.WebException 使用 WebClient 时:无法创建 SSL/TLS 安全通道
System.Net.WebException when using WebClient: Can not create SSL/TLS secure channel
当我执行下面的代码时
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 中运行,并返回结果。
我应该怎么做才能像在浏览器中一样用我的代码执行?
我已经阅读了 Whosebug 中关于此问题的其他帖子 - 但它们没有解决我的问题:-(
如果您关闭 fiddler(如果您打开它)并添加以下异常应该消失
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 =(发件人、证书、链、错误)=> {
return 真;
};
将忽略任何证书验证错误,因此根据定义并不完全安全。请看问题C# Ignore certificate errors?
下面是继承的 WebClient class,它解决了很多像这样的一般问题...
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);
}
}
}
}
享受...
当我执行下面的代码时
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 中运行,并返回结果。
我应该怎么做才能像在浏览器中一样用我的代码执行?
我已经阅读了 Whosebug 中关于此问题的其他帖子 - 但它们没有解决我的问题:-(
如果您关闭 fiddler(如果您打开它)并添加以下异常应该消失
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 =(发件人、证书、链、错误)=> { return 真; };
将忽略任何证书验证错误,因此根据定义并不完全安全。请看问题C# Ignore certificate errors?
下面是继承的 WebClient class,它解决了很多像这样的一般问题...
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);
}
}
}
}
享受...