0

SSL-Client-Auth でクライアントを識別するサーバー アプリケーションを作成しています。すべてのクライアントは、このサーバーに接続するために独自のキーペアと証明書を作成する必要があります。不明なクライアント (新しい公開鍵で識別される) は、新しいクライアントとしてスレッド化され、この公開鍵で登録されます。サーバー側でクライアント証明書に署名したくありません (これはセキュリティを向上させないため)。

しかし、(何百ページも調べた結果)必要なファイル(またはオブジェクト)をプレーンJavaでプログラム的に作成できないようです.KeyStoreには少なくとも自己署名のクライアント証明書が必要になるためです(これはBouncyCastleなしでは作成できません)ライブラリ)。

私は間違っていますか、それとも本当にこれを行う方法はありませんか?

リンクまたはコードを教えてください。Java SSL は非常に複雑すぎるようで、ドキュメントも不十分です。

4

1 に答える 1

2

私の知る限り、JSSE API (JSSE および JCE を含む) には、実際に X.509 証明書を発行するものは何もありません。X.509 構造を手動で処理するのは実際には非常に複雑であり、BouncyCastle を使用せずに BouncyCastle が行うことを複製したい場合は、さらに多くの情報を読む必要があります。

BouncyCastle は、目的を達成するための最も便利な方法です。sun.*パッケージを使用することもできます (keytool自己署名証明書を作成するために使用するため) が、これらのパッケージは公開 JSSE API の一部ではないため、通常は使用しないでください。それらは文書化されておらず、JSSE の特定の実装に依存しており、変更される可能性があります。対照的に、BouncyCastle はライブラリとして使用するためのものです。

サーバー側でクライアント証明書に署名したくありません (これはセキュリティを向上させないため)。

サーバーは (証明書ではなく) 公開鍵のみを使用して認証を実行するため (実装することを選択した公開鍵とユーザー間のマッピングに基づいて)、サーバー側またはクライアント側で証明書を発行することは重要ではありません。セキュリティの面で。クライアントは必要なものに自己署名できますが、サーバーは証明書の残りの部分ではなく、とにかく公開鍵にのみ依存できます。公開鍵を X.509 証明書に「バンドル」する必要がある理由は、それがサポートされている唯一の種類のクライアント証明書だからです (たとえば、JSSE は OpenPGP 証明書をサポートしていません)。

公開鍵を受信し、X.509 証明書 (任意の秘密鍵によって署名された任意のダミー属性を含む) を送信するサービスをサーバー上に配置するのが最も簡単なオプションです。さらに、そのサーバーの内部でミニ CA を使用する場合、自己署名証明書を取得するためにトラスト マネージャーを微調整する必要がある方法が簡素化されます。(そのようなセキュリティスキームを設計したい場合は、内部マッピングで実際の公開鍵を確認する必要があります。)

于 2013-02-10T15:37:53.260 に答える