忘れがちなことを、つらつらと...

俺的備忘録を公開してみるテスト

POP over SSLで「検証プロシージャによると、リモート証明書は無効です。」って...

テスト用のPOP3クライアントを作成したんだが、POP over SSLに対応しないとダメな事が微妙に判明。なんだ、SslStream使えばいいのかと、鼻息荒く作ってみたら 「検証プロシージャによると、リモート証明書は無効です。」

 工エエェェ(´д`)ェェエエ工

証明書はとりあえずいいから、SSL通信だけしたいだけなのに...(´Д⊂グスン

POP3サーバーへの接続用コードはざっくり以下の感じ。

string hostname = "pop3.hogegoge.com";

TcpClient tcp = new TcpClient(hostname, 995);
SslStream stream = new SslStream(tcp.GetStream());
stream.AuthenticateAsClient(hostname);
StreamReader reader = new StreamReader(stream, Encoding.ASCII);
string result = reader.ReadLine();
if (!result.StartsWith("+OK")) {
    throw new Exception("接続時に POP サーバが \"" + s + "\" を返しますた(´・ω・`)");
}

まぁ5行目の、AuthenticateAsClientで問題が発生してるんですよね、これ。

ようは、ブラウザとかで証明書がアレだけれども危険を承知で先に進みますか? '`ィ (゚д゚)/

みたいなことをしたいんですデス。

ggl先生をたぐっていくと、マイクロソフトのサイトに載ってたよw

証明書を検証するコールバック関数書けばいいのかw

// 証明書を無視するコールバック関数
public static bool ValidateServerCertificate(
    object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors
)
{
    return true;
}

とにかくtrue返して常に検証OKみたいな。で、このコールバック関数を登録する場合が

string hostname = "pop3.hogegoge.com";

TcpClient tcp = new TcpClient(hostname, 995);
SslStream stream = newSslStream(
    tcp.GetStream(),
    false, 
    new RemoteCertificateValidationCallback(ValidateServerCertificate),
    null
);
stream.AuthenticateAsClient(hostname);
StreamReader reader = new StreamReader(stream, Encoding.ASCII);
string result = reader.ReadLine();
if (!result.StartsWith("+OK")) {
    throw new Exception("接続時に POP サーバが \"" + s + "\" を返しますた(´・ω・`)");
}

こうなる。