Android上のブラウザからSSLクライアント認証の必要なサーバへアクセスする方法
■ 初めての Android 端末(IS01)のブラウザで困ったこと
KLab では、社員が社外から社内 LAN 上のサーバへ安全にアクセスするために、自社製の SSL-VPN システムである「VPN-Warp」を使っています。これにより、社員はインターネット上の専用の中継サーバへアクセスすることで所定の社内サーバと通信することが可能です。この中継サーバは不正利用を防ぐためにクライアントからの接続要求時に所定の電子証明書の提示を求める「SSL クライアント認証」を行います。KLab の発行した有効な証明書を提示するクライアントからの要求のみがこれを通過できるというわけですね。
さて、筆者は 2010 年末に IS01 を入手し、あれこれ試していたところひとつ困ったことがありました。Web ブラウザが SSL クライアント認証に対応していないため上記の VPN-Warp 中継サーバ経由で社内のサーバへアクセスすることができないのです。スマートフォンに馴染みが薄いためとりあえずの実験用と割りきって確保した端末ではありますが、その点以外は結構気に入っていたため残念に思いました。
■ 「stone」を併用することで解決
先日このブログで Android 用の「stone」一式を公開しましたが、実のところ stone を Android 上で動かしたいと考えたのは、手元の IS01 のブラウザから VPN-Warp 経由で社内サーバへアクセスすることが目的でした。パケットリピータ stone の SSL 対応機能はクライアント認証をサポートしているため、ブラウザと VPN-Warp 中継サーバの間に stone のプロセスを介在させてやれば SSL まわりの処理一式を stone にまかせることができるのです。
stone に クライアント認証対応を含めて SSL 処理を代行させる
実機でこの操作を行った様子を以下に示します。
# 図中の stone コマンドラインは次の内容です stone -d -q pfx="cert.pfx" -q passfile="pass.txt" \ relay.klab.org:443/ssl localhost:8888
■ 実は最近の端末のブラウザもクライアント認証未対応?
さて、ブラウザがクライアント認証に対応していないという制約は筆者の持つ IS01 が旧い Android 1.6 ベースであることに起因するものであって Android 2.x 端末ではきっと解消されているのだろうと漠然と想像していたのですが、実際にはそうではないことを最近になって知りました。
この冬の新機種ブームも相まって社内の Android ユーザが増加する中、「外からイントラにアクセスできたよ!」という声が聞こえてこないのです。利用者に事情を尋ねるとやはりブラウザがクライアント認証をハンドルしない様子とのことでした。しばらく Android から離れていたため事情がわからず情報を探してみると、どうやら本件への対応は今後の課題という扱いのようです。
Android プロジェクト公式フォーラムより
・Issue 11231: Provide support for managing CA and client certificates
・Issue 8196: Enhancement: Client Certificate Authentication in Browser
ご存知の方はとっくにご存知の話だと思いますがちょっと意外に感じました。世間一般に SSL クライアント認証を活用したサービスがあまり多くないことの影響なのかもしれません。
■ 同じ問題で困っている方へ
本件は Android の近い将来のバージョンでの解決が期待されますが、自分と同じく今現在の制約に困っている方の参考になればとこの記事を書くことにしました。Android 用 stone のダウンロードリンクと導入・実行方法を次の記事に掲載しています。
・DSAS開発者の部屋:パケットリピータ「stone」を Android へポーティング
今のところ単体の ELF 実行形式であるため CUI に慣れていないと多少扱いにくいという点と、Android では hosts ファイルの書き換えが一筋縄ではいかない事情もあり接続先によってはブラウザでの localhost 指定が通らない可能性がありますが、本記事を最後まで読み進められた知見と技術力で上手くご利用下さい。なお、stone の詳細については下記サイトの解説記事が参考になるでしょう。
(tanabe)
トラックバックURL
この記事へのコメント
ずっと、クライアント証明書に対応したブラウザが開発されるのを待つか、自分でブラウザを作るしかないと考えていました。
iPhone だとやりかたさえわかってしまえば、簡単だったんですけど、
Android は敷居が高いです。
Xperia arc で stone は問題なく動作していますが、証明書の指定が悪いようで、「Bad Request」という応答が帰ってきてしまう状態です。
もう少しいろいろと試してみます。
進展があったら、またコメントさせて頂きます。
あれから試行錯誤しまして、無事に接続できました。
ただし、コマンドを直接入力しないと
「failed err=9 errno=02 getaddrinfo for localhost serv=8888」
というメッセージが出力され、コネクションが張れません。
緊急時用で常に使うわけではないので、閲覧できるようになっただけで満足です。