オレオレ証明(自己証明書)を突破する
「https:// 〜 」のWebページにアクセスしたいが
証明書に問題があって(期限切れや自己証明書など)アクセスできない場合は以下のようにしてアクセスできます。
(ただし、Compact Frameworkと.net Framework2.0での動作は確認済みですが、.net Framework1.0は確認していません。)
WindowsMobileでこれをやる方法を探していたのですが、
Compact Frameworkじゃ無理かなあとも思ったのですができました。
(Compact FrameworkにはSystem.Net.Securityがなかった。)
Google先生は偉大だなあ。
Compact Frameworkと.net Framework1.1の場合
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace DeviceTest
{
class Program
{
static void Main(string args)
{
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
WebRequest request = WebRequest.Create("https://localhost/");
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
textBox1.text = sr.ReadToEnd();
}
}
public class MyPolicy : ICertificatePolicy
{
public bool CheckValidationResult(
ServicePoint srvPoint,
System.Security.Cryptography.X509Certificates.X509Certificate certificate,
WebRequest request, int certificateProblem)
{
// 信用したことにする
return true;
}
}
}
.net Framework2.0の場合
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace SessionTest
{
class Program
{
static void Main(string args)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
WebRequest request = WebRequest.Create("https://localhost/");
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
Console.WriteLine(sr.ReadToEnd());
}
static private bool OnRemoteCertificateValidationCallback(
Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
// 信用したことにする
return true;
}
}
}