先日事情があってWindows上でのSSLクライアント認証のプログラミングの調査をしました。良く考えたら数年前に使ったことがあったのを忘れていました。健忘録として書いておきます。
SSLのサーバ認証は皆さん
https で始まるサイトを利用する事で使っていると思います。クライアント認証はサーバ側が逆にクライアントを認証して接続の可否を決める仕組みです。X.509形式証明書と秘密鍵を使いますのでPKI的な素養が必要ですがPKIとは言えませんね。
と言うことでプログラミングで考えるとクライアント側からサーバへのhttp通信になります。良く使われているレガシーな通信APIとしては
WinInetがあります。Win32からhttp等の通信をするならWinInetが一般的です。msxml等からも使われています。ところが
WinInetはSSLサーバ認証は対応していますがSSLクライアント認証には対応していません。SSLクライアント認証に対応するにはWinInetの後継である
WinHTTP(
英文)を使うとなっています。
でも何だかWinHTTPを生で使うのは面倒そうです。と言うことで.NET Frameworkのクラスである
HttpWebRequestと
HttpWebResponseを使う事をお勧めします。
HttpWebRequestとHttpWebResponseを使ったクライアント認証の説明とサンプルのページもあります。私の場合はこのページだけでうまく使うことができました。
少し面倒なのが X509Certificate クラスで接続に利用するクライアント証明書を用意するところでしょうか。先のサンプルページでは
「.cer ファイルが必要」となっていますがこれはWindows証明書ストアから取得した方が間違いがありません。
X509Certificate2クラスの関連クラスを利用すればGUIによる証明書選択も可能になりますし必要な証明書を取り出す事も可能です。
私が利用しているBIGLOBEはSSLがFTPで使えないそうです。
それで最近のホームページ改変事件の対策で海外
からFTPでのアクセスができなくなるそうです。