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

新手上路,请多包涵

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

原文由 pizzathehut 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

这还不错。 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 证书。

原文由 ZZ Coder 发布,翻译遵循 CC BY-SA 4.0 许可协议

还没有看到有人提出 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;
}

原文由 josh-cain 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏