Проблемы с WebClient + HTTPS
В настоящее время я интегрируюсь с системой, созданной сторонней стороной. Эта система требует от меня отправки запроса с использованием XML/HTTPS. Третий участник отправил мне сертификат, и я его установил
Я использую следующий код:
using (WebClient client = new WebClient())
{
client.Headers.Add(HttpRequestHeader.ContentType, "text/xml");
System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();
var response = client.UploadData(address, "POST", encoding.GetBytes(msg));
}
Этот код возвращает следующий WebException
:
Подключенное соединение было закрыто: не удалось установить доверительные отношения для защищенного канала SSL/TLS.
UPDATE. Поскольку это тестовый сервер, с которым я работаю, сертификат не доверен и проверка не выполняется... Чтобы обойти это в среде тестирования/отладки, создайте новый ServerCertificateValidationCallback
ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(bypassAllCertificateStuff);
и вот мой "поддельный" обратный вызов
private static bool bypassAllCertificateStuff(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}
Подробнее здесь и здесь
Ответы
Ответ 1
Самая короткая нотация кода для всех сертификатов на самом деле:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
И хорошо работает для этой ошибки. Излишне говорить, что вы должны предоставить реализацию, которая фактически проверяет сертификат и решает на основе информации сертификата, если сообщение безопасно. Для целей тестирования используйте приведенную выше строку кода.
Ответ 2
Для версии исходного ответа VB.NET здесь вы идете (преобразователи не работают хорошо, когда нужно подключать события с помощью оператора AddressOf). 1-й код, предшествующий использованию объекта WebClient() или HttpWebRequest():
ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf bypassAllCertificateStuff)
.. и код метода проводной связи:
Private Shared Function bypassAllCertificateStuff(ByVal sender As Object, ByVal cert As X509Certificate, ByVal chain As X509Chain, ByVal [error] As System.Net.Security.SslPolicyErrors) As Boolean
Return True
End Function
Ответ 3
Попробуйте, это работает:
class Ejemplo
{
static void Main(string[] args)
{
string _response = null;
string _auth = "Basic";
Uri _uri = new Uri(@"http://api.olr.com/Service.svc");
string addres = @"http://api.olr.com/Service.svc";
string proxy = @"http://xx.xx.xx.xx:xxxx";
string user = @"platinum";
string pass = @"01CFE4BF-11BA";
NetworkCredential net = new NetworkCredential(user, pass);
CredentialCache _cc = new CredentialCache();
WebCustom page = new WebCustom(addres, proxy);
page.connectProxy();
_cc.Add(_uri, _auth, net);
page.myWebClient.Credentials = _cc;
Console.WriteLine(page.copyWeb());
}
}
public class WebCustom
{
private string proxy;
private string url;
public WebClient myWebClient;
public WebProxy proxyObj;
public string webPageData;
public WebCustom(string _url, string _proxy)
{
url = _url;
proxy = _proxy;
myWebClient = new WebClient();
}
public void connectProxy()
{
proxyObj = new WebProxy(proxy, true);
proxyObj.Credentials = CredentialCache.DefaultCredentials;
myWebClient.Proxy = proxyObj;
}
public string copyWeb()
{ return webPageData = myWebClient.DownloadString(url); }
}