59

X509Certificate を PEM 形式の文字列に書き込む高レベルの方法はありますか? 現在、x509cert.encode() を実行して DER 形式の文字列に書き込んでから、base 64 でエンコードし、ヘッダーとフッターを追加して PEM 文字列を作成していますが、悪いようです。特に、改行も入れなければならないので。

4

12 に答える 12

70

これは悪くありません。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 で書き出すことができます。

于 2010-07-22T20:48:16.313 に答える
15

以下は、大きな外部ライブラリやバージョンの一貫性のない 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();
于 2015-04-15T13:44:21.667 に答える
10

バウンシーキャッスルの 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();
}
于 2015-01-13T03:57:53.567 に答える
8

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();
}
于 2012-11-30T22:22:50.067 に答える