Java を使用して X.509 証明書を作成する
X.509 は、公開鍵証明書の形式を定義する標準です。 オンライン通信、デジタル署名、および暗号化を保護するために SSL/TLS 証明書で広く使用されています。
この記事では、Java を使用して X.509 証明書を作成する方法を説明します。
要件:
- Java 開発キット (JDK)
- Java 用の Bouncy Castle Crypto API
Java を使用して X.509 証明書を作成する手順
-
Bouncy Castle Crypto API をダウンロードする
Bouncy Castle Crypto API は、暗号化アルゴリズムの Java 実装です。 セキュリティ対応の Java アプリケーションの開発に使用できる軽量の暗号化 API のコレクションを提供します。
Bouncy Castle Crypto API をダウンロードするには、公式ウェブサイト にアクセスし、最新バージョンをダウンロードしてください。
-
Bouncy Castle Crypto API を Java プロジェクトに追加する
Bouncy Castle Crypto API をダウンロードしたら、ライブラリを Java プロジェクトに追加します。 ライブラリは、ビルド システムまたは
classpath
の依存関係として追加できます。 -
キー ペアを生成する
X.509 証明書を作成するには、キー ペアを生成する必要があります。 キー ペアは、秘密キーと公開キーで構成されます。
秘密鍵は証明書の署名に使用され、公開鍵は署名の検証に使用されます。
KeyPairGenerator
クラスを使用して、Java で鍵ペアを生成できます。KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair();
-
自己署名証明書を作成する
自己署名証明書は、信頼できる第三者ではなく作成者によって署名された証明書です。
X509V3CertificateGenerator
クラスを使用して、Java で自己署名証明書を作成できます。X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); // Set the subject DN X500Principal dnName = new X500Principal("CN=Example"); certGen.setSubjectDN(dnName); // Set the issuer DN certGen.setIssuerDN(dnName); // Set the public key certGen.setPublicKey(keyPair.getPublic()); // Set the validity period certGen.setNotBefore(new Date(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 30)); certGen.setNotAfter(new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 10)); // Set the signature algorithm certGen.setSignatureAlgorithm("SHA256WithRSAEncryption"); // Generate the certificate X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC");
-
証明書をファイルに保存する
最後に、X.509 証明書と秘密鍵を格納するための標準形式である PEM 形式で証明書をファイルに保存できます。
FileOutputStream fos = new FileOutputStream("example.pem"); fos.write("-----BEGIN CERTIFICATE-----\n".getBytes()); fos.write(Base64.getEncoder().encode(cert.getEncoded())); fos.write("\n-----END CERTIFICATE-----\n".getBytes()); fos.close();
注: 一部のパッケージのため、このコードはオンライン コンパイラでは実行できません。 この例をプロジェクトの開始点として使用し、特定の要件を満たすようにカスタマイズできます。
出力:
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook