将x509证书写入java中的PEM格式字符串?
有没有一些高级方法可以将X509Certificate写入PEM格式的字符串中?目前,我正在执行x509cert.encode()将其写入DER格式的字符串,然后以64编码并附加页眉和页脚以创建PEM字符串,但这似乎很糟糕。特别是因为我也必须加入换行符。
有没有一些高级方法可以将X509Certificate写入PEM格式的字符串中?目前,我正在执行x509cert.encode()将其写入DER格式的字符串,然后以64编码并附加页眉和页脚以创建PEM字符串,但这似乎很糟糕。特别是因为我也必须加入换行符。
这还不错。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 证书。
还没有看到有人提出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;
}