制御できないサイトからc#WebClientクラスを介してさまざまなhtmlリソースを試行しています。 「 https://archive.org/details/OTRR_In_The_Name_Of_The_Law_Singles 」などのURLにアクセスしようとすると
次のエラーが表示されます:System.Net.WebException:The request was aborted:SSL/TLS secure channelを作成できませんでした。
次のコードを使用して証明書の要件を無視し、webclientをブラウザーとして機能させることをお勧めする解決策を見つけましたが、それでも同じエラーを受け取ります
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
delegate
{
return true;
});
using(WebClient webClient = new WebClient()) {
webClient.Headers["User-Agent"] = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)";
webClient.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webClient.Headers["Accept-Language"] = "en-us,en;q=0.5";
webClient.Headers["Accept-Encoding"] = "gzip,deflate";
webClient.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
StreamReader sr = new StreamReader(webClient.OpenRead(inputString));
}
これを読んでください: http://support.Microsoft.com/kb/915599
アクセスしているサーバーはTLSをサポートしていないため、SSL3を使用するように強制する必要があります。
通話に次の行を追加します。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
完全に機能する例を次に示します。
using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
class Program
{
static void Main(string[] args)
{
Uri address = new Uri("https://archive.org/details/OTRR_In_The_Name_Of_The_Law_Singles");
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 ;
using (WebClient webClient = new WebClient())
{
var stream = webClient.OpenRead(address);
using (StreamReader sr =new StreamReader(stream))
{
var page = sr.ReadToEnd();
}
}
}
/// <summary>
/// Certificate validation callback.
/// </summary>
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
{
// If the certificate is a valid, signed certificate, return true.
if (error == System.Net.Security.SslPolicyErrors.None)
{
return true;
}
Console.WriteLine("X509Certificate [{0}] Policy Error: '{1}'",
cert.Subject,
error.ToString());
return false;
}
.net Framework 4.0で追加
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
var stream = webClient.OpenRead(address);
の前にこの行を追加してください
System.Net.ServicePointManager.ServerCertificateValidationCallback += (send, certificate, chain, sslPolicyErrors) => { return true; };
SSL/TLSエラーを整理する