t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告 | トラックバック(-) | コメント(-) top↑
IIS6でSSL+Basic認証付きWebサービスを作って、プログラムから呼び出す。
IIS 6 上に作ったWebサービスを、Windows Formsからアクセスしていたのですが
このたび、SSL+ Basic認証でWebサービスを保護して、Windows Forms側からの呼び出しも
それに対応することになったので、その方法をメモしておきます。

基本的には、他のサイトさんが書かれていたことの組み合わせなんですが、、、
とりあえず備忘録的に残します。

としては、以下です。
・ IIS 6 に独自証明書を作成して導入する。(ベリサイン等の証明書は使いません)
・ IIS 6 にBasic認証をつける。(Windowsユーザー以外の独自認証を目指します)
・ クライアント側で、独自証明書でもエラーが出ないようにする。
・ クライアント側のWebサービス呼び出しに、認証情報(ID/Pass)を渡す

詳しくは以下です、、、
■IIS 6に独自証明書を作成して導入する。

 方法としてはどうやら、2つあるようです。
 ・Windowsに付属している「証明書発行サービス」を使う。
 ・IISリソースキットの証明書作成ツールを使う。
 
 前者は、サーバーに変な(?)サービスを追加するのがなんとなく気持ち悪い気がしたので
 今回は後者の方法を採用しました。

 まず、IIS6のリソースキットを入手します。
 (結局、ツールのインストールが必要になるわけですが、、、)
 以下のサイトさんが詳しいかったです。

 ●IIS6.0テスト用SSLの手早い設定方法

 このとき使う SelfSSL.exe は、Exeだけサーバーにコピーしても動くので
 リソースキットは開発用マシンに入れておいて、SelfSSL.exe だけ本番にコピー
 といった対応でも可能です。

 こちらの@ITの記事も参考までに。
 ●SSLテスト用にサーバ証明書を自己発行する(IIS 6.0編)
 

 サーバー証明書を導入しただけでは、既存サイトに影響は特にありません。
 SSLでのアクセスが必要なディレクトリに対して設定して初めて有効になります。

 
 ちなみに、証明書発行サービスを使う場合はこちらのサイトが参考になりました。(やってないですが)
 IISでSSLページ(https)を設定する基本的な操作

 
 
■IISに基本認証をつける。

 IIS 6での基本認証は、大きく2つの方法があります。
 IIS側で認証処理を実行するパターンと、ASP.NET 側で認証処理するバターンです。

 前者は、IISの標準機能では Windowsユーザー/パスワードを使った認証しか出来ないという泣ける欠点があります。
 後者は、ASP.NETで処理しないコンテンツ(画像とか静的HTMLとか)に対して認証をかけれないという欠点があります。

 今回は、Webサービス呼び出しを保護する目的なので、後者の欠点はきになりません。
 そこで後者を採用しました。

 IIS 7だと、認証が1つに統合されていてスッキリしているようです。
 IIS 7勉強しないとな~。

 
 後者のASP.NET 側でWindowsユーザーを使わない認証は、自分でプログラミングする必要があります。
 以下のサイトのサンプルコードが非常にありがたかったです。
 ●Windowsユーザーアカウントを使わずにBASIC認証を行う

 
 ちなみに、静的コンテンツも含めて保護する必要があるんだけども、Windowsユーザーを使うのは嫌だ!!という方には、IISPassword というフリーツールを使う方法もあるようです。
 こちらのサイトで紹介されていました。
 IISでApache互換のBASIC認証を使う
 
 IISPassword

ここまでで、サーバー側の設定は終わった、、、はずです。

試しにASP.NETのサイトにアクセスしてみると、HTTPS で かつ認証がないと見れないようになっているはずです。

次にクライアント側プログラムの修正です。


■証明書エラーを回避するコード

HTTPSのWebサービスの呼び出しは、特に何もする必要はなく
呼び出すWebサービスのURLを https でアクセスするだけです。

ただ、デフォルトのままだと、不正な証明書を使ったWebサービスにアクセスすると
"基礎になる接続が閉じられました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした" とかいう例外が発生してしまいます。

これには、こちらのサイトで紹介されていた方法で対応します。

SSL証明書のエラーを回避

System.Net.ServicePointManager に、Staticに設定できるんですね。へぇー。
ちなみに、 ICertificatePolicy を実装するクラスを使って対応する方法もあるようですが
こちらは、Visual Studioに「古いやりかただ」と怒られてしまいました。。。


■Basic認証を使ってWebサービスを呼び出す。

10 行でズバリ !! Web サービスの認証 (C#)

 最後は、MSのサイトです。良かった(笑

 Credentials プロパティに設定している箇所がキモです。

  WSAuth. Service ws = new WSAuth. Service ();
ws.Credentials = new System.Net. NetworkCredential (textBox1.Text, textBox2.Text);




ふぅぅー。

仕事で必要に迫られたとはいえ、セキュアなWebサービス作りの基本が調べられて良かった~


ClickOnceもBasic認証に対応してくれないかな、、、













管理者にだけ表示を許可する


トラックバックURL:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。