SSL覚え書き [ソフトウェア/PC関係]
SSLと言えば,Webサーバー等とのデータのやりとりを暗号化するために使われている代表的なプロトコルである。クレジット・カード番号やパスワードを送信する際は,通信がhttps経由になっているか確認する癖をつけておくのが肝要だ。au oneのログイン画面なんて,トップページからログインするとhttpsなのに,一旦ログアウトして,「別のau one-IDでログインする」を選ぶと,ただのhttpになってしまうので注意が必要。つーか,それって罠? まったく,ケータイ会社ってヤツは,どういうセキュリティ意識を持っているのやら。
それはさておき,Firefox 3.xでアクセスできないhttpsのサイトというのがたまにある。私の知っているケースは,クライアント(Firefox)とサーバーとの間で,サポートされている共通の暗号アルゴリズムがないというものだ。そういう場合は,
Cannot communicate securely with peer: no common encryption algorithm(s). (エラーコード: ssl_error_no_cypher_overlap)
というようなエラー・メッセージが表示される。例えば,クライアントは128ビットRC4をサポートしているのに,サーバーが40ビットRC4しかサポートしていない場合である。サーバーの設定をユーザーがいじるわけにはいかないので,クライアント側で40ビットRC4を利用可能に設定すれば,通信はできるようになる。
Firefoxでこれを有効化するには,次のようにする。まず,URL欄に「about:config」を指定して,Firefoxの詳細設定ページへ行く。「動作保証対象外になります!」という警告には,めげずに「細心の注意を払って使用する」ボタンを押す。ここで設定できる値は山ほどあるので,フィルタ欄に「RC4」を指定すれば,「security.ssl3.rsa_rc4_40_md5」が簡単に見つかるはずだ。デフォルトでは「false」に設定されているはずなので,ダブル・クリックして「true」に変更する。これでOK。
ただし,この設定は相手サーバーに関わらず効いてしまうのが難点。40ビットRC4はもはや安全な暗号アルゴリズムとはみなされていないので,潜在的なセキュリティの脆弱性を抱えることになる。SSLでは,クライアントがサポートしている暗号アルゴリズムのリストをサーバーに提示し,サーバーが適当なものを選ぶ仕組みになっている。したがって,相手さえまともなら,128ビットRC4や,256ビットAESなど,より強いアルゴリズムが選ばれるので,問題はないはず。だが,大きな会社ならサーバーもまともとは言い切れないわけで...。因みに,SSLのページで,右クリック・メニューから「ページの情報を表示」を選ぶと,使用されている暗号アルゴリズムを確認できる。
実際に,クライアントがどういう暗号アルゴリズムのリストを送っているかを確認するには,SSLの初期設定部分(ハンドシェイク)のやりとりを覗き見する必要がある。クライアントとサーバー間で,使用する暗号アルゴリズムが確定してしまうと,以降のやりとりは暗号化されて読めなくなってしまうが,それ以前であればWiresharkのようなパケット・アナライザで簡単に調べられる。Wiresharkは,SSL(TLS)のプロトコルを理解してくれるので,SSLの仕様書と首っ引きで,バイナリ・データを解読する必要もない。
暗号アルゴリズムのリストは,最初にクライアントから送るメッセージ,"Client Hello"に含まれる。Wiresharkでパケット・キャプチャを開始した後,適当なhttpsのサイトにナビゲートし,ページが表示されたら,キャプチャを終了する。相手サーバーのIPアドレスを調べて,filter欄に「ip.dst==202.238.95.65」(https://www.so-net.ne.jpの場合)のように指定すれば,一番上のペインのInfoカラムに,"Client Hello"と書かれた行が見つかるはずだ。それをマウスでクリックすると,中段の「Packet Details」ペインにパケットのデータが表示される。"Secure Socket Layer"(SSLのこと),"TLSv1 Record Layer","Handshake Protocol","Cipher Suites"と順に展開すれば,"Cipher Suite"で始まる行がずらっと現れる。これが,クライアントでサポートしている(とサーバーに通知している),暗号アルゴリズムの一覧である。Firefox 3.6.13ではこんな感じ。
Secure Socket Layer
TLSv1 Record Layer: Handshake Protocol: Client Hello
Content Type: Handshake (22)
Version: TLS 1.0 (0x0301)
Length: 196
Handshake Protocol: Client Hello
Handshake Type: Client Hello (1)
Length: 192
Version: TLS 1.0 (0x0301)
Random
Cipher Suites Length: 72
Cipher Suites (36 suites)
Cipher Suite: Unknown (0x00ff)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
Cipher Suite: TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (0x0088)
Cipher Suite: TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA (0x0087)
Cipher Suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA (0x0038)
Cipher Suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA (0xc00f)
Cipher Suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA (0xc005)
Cipher Suite: TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (0x0084)
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_RC4_128_SHA (0xc007)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
Cipher Suite: TLS_ECDHE_RSA_WITH_RC4_128_SHA (0xc011)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
Cipher Suite: TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (0x0045)
Cipher Suite: TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA (0x0044)
Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)
Cipher Suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA (0x0032)
Cipher Suite: TLS_ECDH_RSA_WITH_RC4_128_SHA (0xc00c)
Cipher Suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA (0xc00e)
Cipher Suite: TLS_ECDH_ECDSA_WITH_RC4_128_SHA (0xc002)
Cipher Suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA (0xc004)
Cipher Suite: TLS_RSA_WITH_SEED_CBC_SHA (0x0096)
Cipher Suite: TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (0x0041)
Cipher Suite: TLS_RSA_WITH_RC4_128_MD5 (0x0004)
Cipher Suite: TLS_RSA_WITH_RC4_128_SHA (0x0005)
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA (0xc008)
Cipher Suite: TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (0xc012)
Cipher Suite: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (0x0016)
Cipher Suite: TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA (0x0013)
Cipher Suite: TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA (0xc00d)
Cipher Suite: TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA (0xc003)
Cipher Suite: SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA (0xfeff)
Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
Compression Methods Length: 1
Compression Methods (1 method)
Extensions Length: 47
Extension: server_name
Extension: elliptic_curves
Extension: ec_point_formats
Extension: SessionTicket TLS
さすがに,40ビットとかDESの56ビットみたいな弱いアルゴリズムは,デフォルトでは無効化されているみたい。
よく,インターネットにカード番号を流すのは怖い,という人がいるが,SSLで適切な暗号アルゴリズムを使っている限り,パケットを傍受して復号するのはまず無理。凄まじい計算量になるからね。怪しい会社や,フィッシングにひっかかったらどうしようもないけど,SSLの安全性とは別の話。よくドラマや映画に,天才的なクラッカーが登場して,どんな暗号でも解読しちゃうなんてのが出てくるけど,基本的に暗号解読は地道な作業なので,非現実的。普通は総当たりだし,せいぜい個人情報からパスワードを類推するのが関の山。先日実際にあった事件では,パスワードの再発行に「秘密の質問」を使ってるシステムを悪用したものがあったそうだ。Facebookに公開されている個人情報から,「秘密の質問」の答をみつけて,勝手にパスワードを変更してシステムにアクセスしていたらしい。「秘密の質問」って,最近本当によく見かけるけど,あれでどれだけセキュリティ・レベルを下げてるか,想像もつかないのかねぇ。パスワードの強度をいくら上げても全く無意味。アホじゃないか。意外にみんな正直に答を設定しているみたいだし。
しかし,いい加減IT技術やクラッカーを,ろくな知識もなく,ドラマや映画でご都合主義的に使うのはやめて欲しいものだなぁ。












コメント 0