X509Certificate を PEM 形式の文字列に書き込む高レベルの方法はありますか? 現在、x509cert.encode() を実行して DER 形式の文字列に書き込んでから、base 64 でエンコードし、ヘッダーとフッターを追加して PEM 文字列を作成していますが、悪いようです。特に、改行も入れなければならないので。
12 に答える
これは悪くありません。Java には、PEM ファイルを書き込む機能はありません。あなたがしていることは正しい方法です。KeyTool でも同じことを行いますが、
BASE64Encoder encoder = new BASE64Encoder();
out.println(X509Factory.BEGIN_CERT);
encoder.encodeBuffer(cert.getEncoded(), out);
out.println(X509Factory.END_CERT);
BouncyCastle を使用する場合、PEMWriter クラスを使用して X509 証明書を PEM で書き出すことができます。
以下は、大きな外部ライブラリやバージョンの一貫性のない sun.* ライブラリを使用していません。これは柔道マンの回答に基づいていますが、OpenSSL、Java などで必要とされるように、64 文字で行をチャンクします。
輸入:
import javax.xml.bind.DatatypeConverter;
import java.security.cert.X509Certificate;
import java.io.StringWriter;
コード:
public static String certToString(X509Certificate cert) {
StringWriter sw = new StringWriter();
try {
sw.write("-----BEGIN CERTIFICATE-----\n");
sw.write(DatatypeConverter.printBase64Binary(cert.getEncoded()).replaceAll("(.{64})", "$1\n"));
sw.write("\n-----END CERTIFICATE-----\n");
} catch (CertificateEncodingException e) {
e.printStackTrace();
}
return sw.toString();
}
(柔道マンの回答にコメントしたところですが、コメントを許可するのに十分な評判ポイントがありません。コメントまたは回答である必要があったため、単純な編集が拒否されたため、回答は次のとおりです。)
ファイルに直接書き込みたい場合は、次のこともimport java.io.FileWriter
行います。
FileWriter fw = new FileWriter(certFilePath);
fw.write(certToString(myCert));
fw.close();
バウンシーキャッスルの PEMWriter をお持ちの場合は、次のことができます。
輸入品 :
import org.bouncycastle.openssl.PEMWriter;
コード :
/**
* Converts a {@link X509Certificate} instance into a Base-64 encoded string (PEM format).
*
* @param x509Cert A X509 Certificate instance
* @return PEM formatted String
* @throws CertificateEncodingException
*/
public String convertToBase64PEMString(Certificate x509Cert) throws IOException {
StringWriter sw = new StringWriter();
try (PEMWriter pw = new PEMWriter(sw)) {
pw.writeObject(x509Cert);
}
return sw.toString();
}
ZZ Coder のアイデアに基づいて構築するにsun.misc
は、JRE バージョン間での一貫性が保証されていないクラスを使用せずに、これを検討してください。
使用クラス:
import javax.xml.bind.DatatypeConverter;
コード:
try {
System.out.println("-----BEGIN CERTIFICATE-----");
System.out.println(DatatypeConverter.printBase64Binary(x509cert.getEncoded()));
System.out.println("-----END CERTIFICATE-----");
} catch (CertificateEncodingException e) {
e.printStackTrace();
}