|
限られた相手にのみWebサイトを公開するには、いくつかの認証方式があり、ユーザIDとパスワードによる認証がよく使われていますが、これらの認証方式にはいくつかの問題があり、安全とはいえません。 ユーザIDとパスワードによる認証方式の特徴 ・ベーシック認証 (Basic Authentication) ユーザIDとパスワードは暗号化されず平文(ひらぶん)でネットワーク上を流れるため、通信経路上のパケットを悪意のある第三者が盗聴すれば、暗号化されていないユーザIDやパスワードを使い、ユーザになりすますことが簡単にできてしまいます。
・ダイジェスト認証 (Digest Authentication) ユーザIDとパスワードおよびサーバが送った乱数を使った認証で、ハッシュ化したパスワードと乱数をさらにハッシュ化したメッセージダイジェストがネットワークを流れるため、パスワードが平文で流れるベーシック認証よりはましになりますが、認証後のデータのやりとりは暗号化されないため、安全性に欠けます。また、古いブラウザでは対応してない場合があります。 ・フォーム認証 (Form Authentication) Webページのフォームに入力されたユーザIDとパスワードを、サーバに送る方式です。ユーザIDとパスワードは暗号化されていません。
このように、Web上でユーザを認証するには、多くの問題があります。意図した相手と安全に通信する方式としては、SSL/TLSがあります。 SSL/TLSサーバ認証とクライアント認証 ・SSL/TLSサーバ認証
SSL/TLSサーバ認証は、ベリサインなどの認証局(CA:Certificate Authority)から発行された「サーバ証明書」をサーバ側で設定し、通信の暗号化とサーバの認証を行い、「盗聴」・「改竄」・「なりすまし」を防止することを目的に、ショッピングサイトなどで広く使われている方式です。 具体的には、サーバで秘密鍵と公開鍵のキーペアを生成し、その公開鍵を自サイトの情報(ドメイン名等)をサブジェクトとした署名前証明書(CSR)とともに認証局に送ります。認証局は署名前証明書を審査し、OKならば、署名前証明書を認証局の秘密鍵で署名(暗号化)したデータを付加して、サーバ証明書を発行します。サーバ証明書の署名を復号できるのは、キーペアである認証局の公開鍵だけです。公開鍵は認証局の証明書に登録されています。 「証明書でサーバを認証する」とは? たとえば、銀行で口座を開設する際には、本人確認のためにパスポートや運転免許証のような公的機関が発行する身分証明書の提示を求められます。公的機関が発行する証明書は「信頼できる」ので、銀行の担当者は写真を確認し、本人確認を行います。 それと同じように、SSL/TLSサーバ認証は、そのサイトに接続した際にクライアントがサーバに対して証明書の提示を求めます。IEやFireFoxのようなブラウザには、あらかじめ著名な認証局のルート証明書が組み込まれています。これらの認証局は「信頼できる」と自分が認めているということになります。 信頼する認証局に登録されたルート証明書は、サーバが提示した証明書の署名を検証し(認証局の公開鍵で復号する)、問題なければ通信を許可します。その後で、クライアントはお互いの暗号に使う共通鍵を、サーバの公開鍵で暗号化してサーバに送ります。サーバはサーバの秘密鍵で復号し、受け取った共通鍵でこれからやりとりするデータの暗号化を行います。また、途中でデータの改ざんがあったとしても、メッセージダイジェストにより検知することが可能です。 ・SSL/TLSクライアント認証 サーバ認証に加えて、サーバ側からもクライアントを認証する方法です。クライアント用に証明書を発行し、クライアントは自分のPCの証明書ストアに証明書を保存しておきます。接続の際に、お互いの証明書を交換し合い、自分の信頼する認証局が発行した証明書に問題がなければ接続が許可されます。この方式が最もセキュリティレベルが高い方式です。 クライアント認証を試してみる 最もセキュアな方式である「SSL/TLSクライアント認証」を試してみました。おおまかな手順は以下のとおりです。 1.証明書の準備 ・サーバ証明書の署名前証明書を作成し、認証局に申請してサーバ証明書を発行してもらう ・プライベート認証局の構築とクライアント証明書の発行
2.Webサーバの設定 ・ApacheのインストールとSSL/TLSクライアント認証の設定
3.クライアントPCの設定と接続確認 ・証明書ストアにクライアント証明書をインストール |