私の知る限り、JSSE API (JSSE および JCE を含む) には、実際に X.509 証明書を発行するものは何もありません。X.509 構造を手動で処理するのは実際には非常に複雑であり、BouncyCastle を使用せずに BouncyCastle が行うことを複製したい場合は、さらに多くの情報を読む必要があります。
BouncyCastle は、目的を達成するための最も便利な方法です。sun.*
パッケージを使用することもできます (keytool
自己署名証明書を作成するために使用するため) が、これらのパッケージは公開 JSSE API の一部ではないため、通常は使用しないでください。それらは文書化されておらず、JSSE の特定の実装に依存しており、変更される可能性があります。対照的に、BouncyCastle はライブラリとして使用するためのものです。
サーバー側でクライアント証明書に署名したくありません (これはセキュリティを向上させないため)。
サーバーは (証明書ではなく) 公開鍵のみを使用して認証を実行するため (実装することを選択した公開鍵とユーザー間のマッピングに基づいて)、サーバー側またはクライアント側で証明書を発行することは重要ではありません。セキュリティの面で。クライアントは必要なものに自己署名できますが、サーバーは証明書の残りの部分ではなく、とにかく公開鍵にのみ依存できます。公開鍵を X.509 証明書に「バンドル」する必要がある理由は、それがサポートされている唯一の種類のクライアント証明書だからです (たとえば、JSSE は OpenPGP 証明書をサポートしていません)。
公開鍵を受信し、X.509 証明書 (任意の秘密鍵によって署名された任意のダミー属性を含む) を送信するサービスをサーバー上に配置するのが最も簡単なオプションです。さらに、そのサーバーの内部でミニ CA を使用する場合、自己署名証明書を取得するためにトラスト マネージャーを微調整する必要がある方法が簡素化されます。(そのようなセキュリティスキームを設計したい場合は、内部マッピングで実際の公開鍵を確認する必要があります。)