QA@IT

ハンドシェイク後にサーバがクライアント証明書の情報を取得できるでしょうか?

6445 PV

初めて質問を致します。至らない点はご容赦ください。
現在、タイトルの内容が可能であることを前提に設計を考えていますが
そもそも知識不足のため、実現できるか否かがわからず、可能な範囲で
調べましたが解答には至りませんでした。
ご存知の方がいらっしゃいましたら、すみませんがご教授お願いできま
せんでしょうか。

1.SSLのハンドシェイクではサーバ証明書の認証のみを行います。
  (ここは変更できません)
2.ユーザがIDとパスワード入力して業務システムの認証を行います。
3.上記2がOKの場合、サーバがクライアントに対してクライアント
  証明書を要求して返信された複数の証明書をサブジェクトの内容で
  検索して、業務続行が可能である証明書を保有しているかを判断し
  ます。

上記1の仕組みが変更できない状況での苦肉の策です。
不明な点は、一度SSL通信が確立した後で、サーバのアプリケーショ
ンが、クライアントに対して証明書の送信を要求できるかというところ
です。製造はjavaで行います。
勉強不足で誠に恐縮ですが、ご教授いただけると大変助かります。
関連する資料をご教示いただけると、もっと助かります。

どうか、宜しくお願い致します。

  • 普通に Web サーバーとの間で HTTP 通信を行うのであれば「サーバがクライアントに対してクライアント証明書を要求して返信された複数の証明書をサブジェクトの内容で検索」は不可能だと思うのですが、IE + ActiveX などの手段を使うことも考えるのでしょうか? -
  • ご回答ありがとうございます。助かります。複数の証明書の受信そのものが無理なようですね。。。IE+ActiveXとはクライアント側に仕掛けを持たせると理解しましたが、残念ながらクライアントに条件をつけるのは無理な状況です。ありがとうございました。 -

回答

javaでサーバー側のアプリケーションを作ろうとしているのですよね?最初のハンドシェイクでは
クライアント認証をOFFにしておいて、再ハンドシェイクでONにすればいいのではないでしょうか?

JSSEリファレンス・ガイド

上記からの引用

ハンドシェークの再実行(再ネゴシエーション)
初期のハンドシェークが完了してアプリケーション・データが流れているとき、いずれの側からでも新しいハンドシェークをいつでも開始できます。特に重要な操作について、アプリケーションで強力な暗号化方式群を使用したり、サーバー・アプリケーションでクライアント認証が必要になる場合もあります。
(...)

クライアント認証のON/OFFはsetNeedClientAuth()setWantClientAuth()でできるはずで、
再ハンドシェイクはSSLServerSocketを使う場合はstartHandshake()で、SSLEngineを使う場合は
beginHandshake()でできるはずです。

参照
SSLSocket (Java Platform SE 8)
SSLEngine (Java Platform SE 8)

返信された複数の証明書はgetPeerCertificates()などで取得できますが、返ってくるのは証明書
チェーンなので、ピア自体の証明書は1個です。

参照
SSLSession (Java Platform SE 8)

編集 履歴 (1)
  • ご回答ありがとうございます。非常に助かります。はい、サーバのアプリケーションです。ハンドシェークは再実行が可能なんですね。これなら要件をみたすことができそうです。おかげさまで調査・勉強する方向性が定まりました。取得できる証明書については、要勉強です。複数の団体から証明書の登録を義務付けられているクライアントを想定しています。求めていた回答を本当にありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。