将x509证书写入java中的PEM格式字符串?

2022-08-31 16:00:29

有没有一些高级方法可以将X509Certificate写入PEM格式的字符串中?目前,我正在执行x509cert.encode()将其写入DER格式的字符串,然后以64编码并附加页眉和页脚以创建PEM字符串,但这似乎很糟糕。特别是因为我也必须加入换行符。


答案 1

这还不错。Java不提供任何函数来编写PEM文件。你正在做的事情是正确的方法。甚至KeyTool也做同样的事情,

BASE64Encoder encoder = new BASE64Encoder();
out.println(X509Factory.BEGIN_CERT);
encoder.encodeBuffer(cert.getEncoded(), out);
out.println(X509Factory.END_CERT);

如果使用 BouncyCastle,则可以使用 PEMWriter 类在 PEM 中写出 X509 证书。


答案 2

还没有看到有人提出Java 8的方法 - 实际上允许您指定行长度行分隔符,如下所示:Base64.getMimeEncoder

final Base64.Encoder encoder = Base64.getMimeEncoder(64, LINE_SEPARATOR.getBytes());

我查看此^与标准编码器是否有任何区别,我找不到任何东西。javadoc为BASIC和MIME编码器引用了RFC 2045,并为BASIC添加了RFC 4648。AFAIK 这两个标准都使用相同的 Base64 字母表(表格看起来相同),因此,如果您需要指定行长,则应使用 MIME。

这意味着在 Java 8 中,这可以通过以下方式完成:

import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.util.Base64;

...

public static final String BEGIN_CERT = "-----BEGIN CERTIFICATE-----";
public static final String END_CERT = "-----END CERTIFICATE-----";
public final static String LINE_SEPARATOR = System.getProperty("line.separator");

...

public static String formatCrtFileContents(final Certificate certificate) throws CertificateEncodingException {
    final Base64.Encoder encoder = Base64.getMimeEncoder(64, LINE_SEPARATOR.getBytes());

    final byte[] rawCrtText = certificate.getEncoded();
    final String encodedCertText = new String(encoder.encode(rawCrtText));
    final String prettified_cert = BEGIN_CERT + LINE_SEPARATOR + encodedCertText + LINE_SEPARATOR + END_CERT;
    return prettified_cert;
}

推荐