■ 注意
* X509Certificate は、2種類ある (1) javax.security.cert.X509Certificate (2) java.security.cert.X509Certificate
■ サンプル
(1) javax.security.cert.X509Certificate編
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.Base64; import java.util.Base64.Encoder; import javax.security.cert.CertificateEncodingException; import javax.security.cert.CertificateException; import javax.security.cert.X509Certificate; public class Main { private static final String BEGIN_CERT = "-----BEGIN CERTIFICATE-----\n"; private static final String END_CERT = "\n-----END CERTIFICATE-----"; public static void main(String[] args) { try { X509Certificate certificate = loadCertificate("./etc/cacert.crt"); String contentInPem = toPem(certificate); outputFile("./etc/cacertOutput.pem", contentInPem); System.out.println("See ./etc/cacertOutput.pem"); System.out.println("Done..."); } catch (Exception ex) { ex.printStackTrace(); } } // 証明書ファイル→X509Certificate を変換 private static X509Certificate loadCertificate(String certificatePath) throws FileNotFoundException, IOException, CertificateException { try (FileInputStream inputStream = new FileInputStream(new File(certificatePath))) { X509Certificate returnValue = X509Certificate.getInstance(inputStream); returnValue.checkValidity(); return returnValue; } } // X509Certificate→ 証明書ファイル(公開鍵) を変換 private static String toPem(X509Certificate certificate) throws CertificateEncodingException { Encoder encoder = Base64.getEncoder(); byte[] derCertificate = certificate.getEncoded(); return BEGIN_CERT + new String(encoder.encode(derCertificate)) + END_CERT; } // ファイル出力 private static void outputFile(String outputFilePath, String fileContent) throws IOException { try (FileWriter fileWriter = new FileWriter(outputFilePath)) { fileWriter.write(fileContent); } } }
(2) java.security.cert.X509Certificate編
以下の関連記事のサンプルで使用している。https://blogs.yahoo.co.jp/dk521123/37097725.html
一部抜粋
private static final String CERTIFICATE_TYPE = "X.509";
// X509Certificate→ 証明書ファイル を変換
// エクスポート機能
public void exportCertificate(String alias, String exportFilePath)
throws CertificateEncodingException, IOException, KeyStoreException {
try (FileOutputStream outputStream = new FileOutputStream(new File(exportFilePath))) {
X509Certificate x509Certificate = this.getCertificatesByAlias(alias);
outputStream.write(x509Certificate.getEncoded());
}
}
// 証明書ファイル→X509Certificate を変換
private static X509Certificate getX509Certificate(String certificateFilePath)
throws IOException, CertificateException {
try (InputStream inputStream = new FileInputStream(new File(certificateFilePath))) {
CertificateFactory certificateFactory = CertificateFactory.getInstance(CERTIFICATE_TYPE);
return (X509Certificate) certificateFactory.generateCertificate(inputStream);
}
}
// 証明書(byte[])→X509Certificate を変換
private static X509Certificate getX509Certificate(byte[] certificates)
throws IOException, CertificateException {
try (InputStream inputStream = new ByteArrayInputStream(certificates)) {
CertificateFactory certificateFactory = CertificateFactory.getInstance(CERTIFICATE_TYPE);
return (X509Certificate) certificateFactory.generateCertificate(inputStream);
}
}
参考文献
https://stackoverflow.com/questions/3313020/write-x509-certificate-into-pem-formatted-string-in-java関連記事
Javaで、キーストアファイルをロードし、一覧表示する
https://blogs.yahoo.co.jp/dk521123/37020660.html【Java】SSL証明書の拇印/フィンガープリントを生成するには...
https://blogs.yahoo.co.jp/dk521123/37002407.htmlSSL / TLS ~用語・拡張子編~
https://blogs.yahoo.co.jp/dk521123/33100623.htmlJava で暗号化/複合化する ~Java1.8 標準を使用した場合~
Base64の変換https://blogs.yahoo.co.jp/dk521123/34330480.html