セキュリティ · 1 min read · Jan 06, 2026
フィッシングを相互認証で防ぐ
フィッシングを相互認証で防ぐ
フィッシングは本質的に中間者攻撃です。ユーザーは、ソーシャルエンジニアリングやDNSキャッシュポイズニングなどによって、詐欺サイトに誤誘導されます。ユーザーがSSL証明書を検証する方法を理解していないため(誰が理解しているのでしょうか?)、この手口は非常に頻繁に成功します。拡張検証証明書のような取り組みは、一貫性のない視覚的な補助に依存しているため、多くの場合失敗する運命にあります。また、一回限りのパスワードだけでは、リアルタイムのMITM攻撃に対して脆弱であることが証明されています。フィッシングを一貫して防ぐためには、強力な相互認証が必要です - ユーザーに対してホストを検証し、ホストに対してユーザーを検証します。
この文書では、WiKIDのオープンソースの一回限りのパスワードと相互認証システムを使用してJSPアプリケーションを構成します。動作の流れは次のとおりです:ユーザーがターゲットサイトにログインしたい場合、WiKIDトークンクライアントを起動し、PINを入力します。PINはサーバーの公開鍵で暗号化され、サーバーに送信されます。PINが正しく、暗号化が有効で、アカウントがアクティブであれば、OTP、ターゲットサイトのURL、およびターゲットサイトのSSL証明書のハッシュがトークンクライアントに送信されます。トークンクライアントはユーザーのインターネット接続を介してターゲットサイトのURLにアクセスし、SSL証明書を取得し、それをハッシュ化して検証済みの証明書ハッシュと比較します。2つのハッシュが一致すれば、トークンクライアントはOTPを提示し(サポートされているプラットフォームでは)ユーザーのためにサイトへのデフォルトブラウザを起動します。
まず、アプリケーション用にWiKIDサーバーにドメインを追加し、次にJSPページ用のネットワーククライアントを作成します。WiKIDのログインコードをJSPページに追加し、トークンクライアントからテストします。
WiKIDサーバーにドメインを追加する
これは非常に簡単です。WiKIDサーバーのWeb管理インターフェースから、ドメインタブをクリックし、新しいドメインを作成します。ゲートウェイのドメイン名とデバイス名を入力します。デバイス名はWiKIDトークンに表示されます。登録URLボックスにはターゲットサーバーのJSPページのURLを入力します。ドメインが作成されると、WiKIDサーバーはWebサーバーから証明書を取得するので、’https:’を入力することを確認してください。サーバーコードは、WiKIDサーバーのルータブルなゼロパディングされたIPアドレスになります(例:10.1.1.1 = 010001001001)。他のパラメータはお好みで設定してください。長いPINは数学的にセキュリティを高めるかもしれませんが、4桁のPINの方が良いかもしれません:ユーザーがATMのPINを使用する場合、それを保護する可能性が高くなります。

ネットワーククライアントを作成する
ドメイン情報を保存した後、ネットワーククライアントタブをクリックし、新しいネットワーククライアントを作成します。このクライアントの名前と、内部ネットワーク上のターゲットサーバーのIPアドレスを入力します。プロトコルとしてwAuthを選択し、上記で作成したドメインを選択します。

追加をクリックして次のページに進み、ターゲットサーバーのp12証明書の情報を入力します。JSPサーバーとWiKIDサーバー間の通信は、このp12ファイルを使用してSSLで暗号化されます。このp12ファイルのパスフレーズを2回入力し、構成プロセス中にサーバーの証明書に使用したパスフレーズを入力します。ネットワーククライアントページに戻ると、新しいネットワーククライアントがリストされ、p12ファイルをダウンロードするリンクが表示されます。p12ファイルをダウンロードし、JSPコードと同じディレクトリに配置します。

JSPページの構成
JSPサーバーには、WiKIDサーバーで作成されたp12ファイル、WiKID Javaネットワーククライアントjar(Wikid.jar)ファイル(当社のウェブサイトまたはSourceforgeサイトから入手可能)、およびJSPページが必要です。さらに、Javaバージョン1.4.2_06以降を実行している必要があります。各ネットワーククライアントパッケージには、サンプルページが含まれています。ここでは、example.jspページを編集します。このページには、新しいユーザーをプログラム的に追加するためのコードも含まれています。
お気に入りのエディタでJSPページを開きます:
まず、WiKIDクライアントをインポートします:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="com.wikidsystems.client.*" %> このセクションは、ネットワーククライアントアプリケーションとWiKIDサーバー間の接続を初期化します。これが成功するためには、ネットワーククライアントがWiKIDサーバーから証明書を発行されている必要があります。証明書はPKCS12証明書ストアに含まれており、アクセスするためにパスフレーズが必要です。caStoreは、接続するWiKIDサーバーの証明書を含むJavaキーストアです。これをWASから/opt/WiKID/private/CACertStoreとしてコピーできます。caStorePassはcaStoreファイルを開くためのパスフレーズです。
wClientオブジェクトが初期化されると、証明書が読み込まれ、永続的な認証済みSSL接続が確立されます。これは通常、サーバーまたはアプリケーションごとに1回行われ、複数のスレッドで共有されます。この例では、オブジェクトは各ページリクエストごとに作成され、破棄されます。これにより、プロセスのオーバーヘッドが大幅に(1000倍)増加しますが、この単一のサンプルページで全ての機能を示すことができます。
パラメータは次のとおりです:
- wClient(String host, int port, String keyfile, String pass)
- host = WIKIDサーバーのIPアドレス
- port = 接続するTCPポート番号(デフォルト8388)
- keyfile = PKCS12証明書ファイルへのパス
- pass = PKCS12ファイルを開くためのパスフレーズ
- caStore - WASサーバー証明書を検証するための証明書機関ストア、これをWiKIDサーバーからダウンロードします(opt/WiKID/private/CACertStore <– Javaのcacertsファイルは使用しないでください)
- caStorePass - caStoreファイルを保護するパスフレーズ
<% String status="";
String chall="";
wClient wc = new wClient("192.168.0.1",
8388,
"/opt/tomcat/webapps/example/Token_test_client.p12",
"yourpassphrase",
"/opt/tomcat/webapps/example/CACertStore",
"yourpassphrase");
%> オンラインログイン
この機能は、ユーザーの通常の状態のログインです。これは、ユーザーのデバイスがネットワークに接続され、アクセスのためのパスコードを直接要求できるときに呼び出されます。
パラメータは次のとおりです:
- CheckCredentials(String user, String passcode, String servercode)
- user = 認証情報を検証するためのユーザーID
- passcode = 時間制限付きの1回使用のパスコード
- servercode = WiKIDサーバーで作成された12桁のコード、この場合は333344445555
このメソッドは、成功または失敗した認証を表すブール値を返します。
<%
boolean isValid = false;
if(request.getParameter("action") != null && request.getParameter("action").equalsIgnoreCase("Check Online")){
isValid = wc.CheckCredentials(request.getParameter("user"), request.getParameter("passcode"), request.getParameter("servercode"));
if (isValid){
status="成功";
} else {
status="認証に失敗しました";
}
}
%> そして、フォームのHTMLは次のとおりです:
オンラインログイン:
トークンクライアントでのテスト
まだダウンロードしていない場合は、WiKIDのオープンソーストークンクライアントのコピーをダウンロードできます。プラットフォームに応じて、’run.sh’または’run.bat’でトークンを起動します。トークンクライアントを初めて起動する際には、パスフレーズを作成する必要があります。起動したら、アクションを選択し、新しいドメインを作成を選択します。

12桁のドメイン識別子を入力すると、公開鍵がWiKIDサーバーに送信されます。PINの入力を求められます。

WiKIDサーバーはPINを保存し、登録コードを返します。

この時点で、WiKIDサーバーにアカウントが作成されましたが、アクティブではありません。既存の信頼できる認証情報やアウトオブバウンズメカニズムに基づいてユーザーの自己サービス登録ページを作成できますが、今回はWiKIDサーバーでユーザーを手動で検証します。WiKIDAdminのWebインターフェースから、ユーザーをクリックし、ユーザーを手動で検証を選択します。登録コードをクリックし、ユーザー名を入力します。

今、トークンクライアントから作成したドメインを選択し、PINを入力します。一回限りのパスコードが返されるはずで(クリップボードにコピーされるべきです)、ブラウザが登録URLに起動するはずです。
一回限りのパスコードをユーザー認証に組み合わせ、ホスト証明書の検証を組み込み、自動的にブラウザを起動することで、ユーザーにとって使いやすく、かつ暗号的に堅牢なシステムを作成しました。トークンクライアントは、公開鍵暗号方式を使用することでセキュリティを低下させることなく、複数のドメイン関係を処理することができます。また、サーバーは複数のネットワーククライアント関係を管理することができます。Ruby、PHP、Python、ASP/COM/.NET用の追加のネットワーククライアントの例も利用可能です。ApacheまたはIISは、RadiusまたはLDAPを使用して構成することもできます。
このプロセスを(匿名で)http://www.wikidsystems.com/signup/example.jsp でテストできます。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。