1

ユーザーの CAC カードの証明書を使用して、Web サービス クライアント (Axis2) から SSL 通信を有効にしようとしています。魅力のように機能します....WebサーバーがCACを有効にするまで。その時点で、SSL 接続は拒否され、チェーン内の他の証明書が含まれていないというエラー メッセージが表示されます。

プロバイダーを security.properties ファイルに追加するか、プログラムで作成することにより、プロバイダーが使用可能であることを確認しました。

私の現在のアプローチは、単にシステム プロパティを設定することです: System.setProperty("javax.net.ssl.keyStore", "NONE"); System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");

この質問/回答から、このアプローチは「エンドエンティティ」証明書のみを送信することを理解しています。どうやら、独自の X509KeyManager を実装する必要があるようです。これは私にとって新しい分野です。誰かが良い参考文献を提案したり、その方法のサンプルを提供したりできますか?

支援に感謝します。

4

1 に答える 1

1

最適なキー マネージャーの実装は、使用する予定の証明書の発行者によって異なります。

ユーザーの CAC の証明書が常に特定の CA によって発行される場合は、その発行者の証明書と中間証明書を PKCS #7 ファイルのチェーンのさらに上に保存します。このgetCertificateChain()メソッドでは、このコレクションをユーザーの証明書に盲目的に追加して返すことができます。

物事がそれほど単純ではなく、可能性のある発行者の完全なリストを列挙できる場合は、すべての証明書発行者の証明書などをルート証明書まで取得します。

すべてのルート証明書を信頼できるエントリとしてキー ストアに追加します。中間証明書を PKCS-#7 形式のファイルにバンドルします。

実装します (またはを使用している場合はX509KeyManager拡張します)。具体的には、このメソッドでは、を使用して、ユーザーの証明書から信頼されたルートへの有効なチェーンを作成します。ターゲットは、パラメーターを使用してユーザーの CAC からロードする証明書です。信頼されたルートは、作成したトラスト ストア内の証明書です。中間証明書は PKCS #7 ファイルからロードして、ビルダー パラメーターに追加できます。チェーンが構築されたら、証明書のパスを取得して配列に変換します。これがメソッドの結果です。X509ExtendedKeyManagerSSLEnginegetCertificateChain()CertPathBuilderaliasgetCertificateChain()

誰がユーザーの証明書を発行するかを予測できない場合は、実行時に LDAP ディレクトリまたは他のリポジトリから中間証明書を取得できる可能性があります。それはまったく新しいレベルの難易度です。

于 2009-12-07T22:58:16.883 に答える