質問

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

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

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

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

ご協力に感謝いたします。

役に立ちましたか?

解決

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

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

物事はそれほど単純ではありませんが、考えられる発行者の完全なリストを列挙し、そのすべての証明書を取得できる場合は、 彼らの 発行者の証明書など、ルート証明書に至るまで続きます。

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

埋め込む X509KeyManager (または延長する X509ExtendedKeyManager あなたが一緒に働いているなら SSLEngine)。具体的には、 getCertificateChain() メソッドを使用する場合は、 CertPathBuilder ユーザーの証明書から信頼されたルートまでの有効なチェーンを作成します。の 目標 は、ユーザーの CAC からロードする証明書です。 alias パラメータ。の 信頼できるルート 作成したトラストストア内の証明書です。中間証明書は次のとおりです ロード済み PKCS #7 ファイルから、および ビルダーパラメータに追加されました。 チェーンが構築されると、 証明書のパスを取得する そして 変換する 配列に。これは、 getCertificateChain() 方法。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top