まず、PKCS#11のサポートをインストールする必要があります。これは、PKCS#11インターフェイスを提供する.dll(または.so)を提供する、おそらくカードリーダーに付属するネイティブコードです。 Mozilla製品やSunのPKCS#11プロバイダなど、システム上の他のソフトウェアはこのライブラリを使用します。 (マイクロソフト製品はしばしば別のインターフェイス「CAPI」を使用します)
PKCS #11 Reference Guide,の指示に従って、SunPKCS11
プロバイダを設定します。私がセットアップで提供しなければならなかった唯一のプロパティは、インストールされたネイティブ "ライブラリ"の場所とこのプロバイダの "名前"サフィックスです。 "name"プロパティは "SunPKCS11-"に追加されます。したがって、名前に "CAC"を指定すると、を後でSecurity.getProvider("SunPKCS11-CAC")
で検索できます。
その後、あなたはCACのキーマテリアルへのJSSEのアクセス権を与える("PKCS11"
の値を持つ)とjavax.net.ssl.keyStoreType
("NONE"
の値を持つ)標準JSSEシステム・プロパティjavax.net.ssl.keyStore
を使用することができます。パスワードプロパティを設定する必要はありません。ネイティブコードでは、必要なときにユーザーにPINを入力する必要があるためです。
注意点は、ユーザーの「エンドエンティティ」証明書のみがCACから入手できることです。信頼できるチェーンを構築するために、ほとんどのサーバーはクライアントが中間証明書を送信することを期待しています。これを回避することは可能ですが、複雑です。具体的には、javax.net.ssl.X509KeyManager
を実装する必要があります。あなたが作業しているサーバが完全なチェーンを必要とする場合は、フォローアップの質問を投稿してください。
http://stackoverflow.com/questions/544056/common-access-card-cac-authentication-using-javaを見てみると、いくつかの参考になるかもしれません。 –