ZZ *_*der 57
这不错.Java不提供任何编写PEM文件的功能.你正在做的是正确的方法.甚至KeyTool做同样的事情,
BASE64Encoder encoder = new BASE64Encoder();
out.println(X509Factory.BEGIN_CERT);
encoder.encodeBuffer(cert.getEncoded(), out);
out.println(X509Factory.END_CERT);
Run Code Online (Sandbox Code Playgroud)
如果使用BouncyCastle,则可以使用PEMWriter类在PEM中写出X509证书.
小智 18
以前的答案给出了3de方软件(如PHP)的兼容性问题,因为PEM证书没有正确分块.
进口:
import org.apache.commons.codec.binary.Base64;
Run Code Online (Sandbox Code Playgroud)
码:
protected static String convertToPem(X509Certificate cert) throws CertificateEncodingException {
Base64 encoder = new Base64(64);
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
String end_cert = "-----END CERTIFICATE-----";
byte[] derCert = cert.getEncoded();
String pemCertPre = new String(encoder.encode(derCert));
String pemCert = cert_begin + pemCertPre + end_cert;
return pemCert;
}
Run Code Online (Sandbox Code Playgroud)
jos*_*ain 16
还没有看到有人提出Java 8的Base64.getMimeEncoder方法 - 实际上允许你指定行长度和行分隔符,如下所示:
final Base64.Encoder encoder = Base64.getMimeEncoder(64, LINE_SEPARATOR.getBytes());
Run Code Online (Sandbox Code Playgroud)
我看看这个^与标准编码器有什么不同,我找不到任何东西.该javadoc的引用RFC 2045的基本和MIME编码器,增加的RFC 4648的BASIC.AFAIK这两个标准使用相同的Base64字母表(表格看起来相同),因此如果需要指定行长度,则可以使用MIME.
这意味着使用Java 8,可以通过以下方式实现:
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.util.Base64;
Run Code Online (Sandbox Code Playgroud)
...
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");
Run Code Online (Sandbox Code Playgroud)
...
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;
}
Run Code Online (Sandbox Code Playgroud)
jtb*_*tbr 11
以下不使用大型外部库或可能版本不一致的sun.*库.它建立在judoman的答案之上,但它也按照OpenSSL,Java和其他人的要求将行分为64个字符.
进口:
import javax.xml.bind.DatatypeConverter;
import java.security.cert.X509Certificate;
import java.io.StringWriter;
Run Code Online (Sandbox Code Playgroud)
码:
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();
}
Run Code Online (Sandbox Code Playgroud)
(我会对Judoman的回答发表评论,但我没有足够的声望点可以发表评论,我的简单编辑被拒绝了,因为它应该是评论或答案,所以这就是答案.)
如果你想直接写入文件,还要import java.io.FileWriter:
FileWriter fw = new FileWriter(certFilePath);
fw.write(certToString(myCert));
fw.close();
Run Code Online (Sandbox Code Playgroud)
如果您有充气城堡的PEMWriter,那么您可以执行以下操作:
进口:
import org.bouncycastle.openssl.PEMWriter;
Run Code Online (Sandbox Code Playgroud)
代码:
/**
* 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();
}
Run Code Online (Sandbox Code Playgroud)
小智 8
要构建ZZ Coder的想法,但不使用sun.misc不保证在JRE版本之间保持一致的类,请考虑这个
使用类:
import javax.xml.bind.DatatypeConverter;
Run Code Online (Sandbox Code Playgroud)
码:
try {
System.out.println("-----BEGIN CERTIFICATE-----");
System.out.println(DatatypeConverter.printBase64Binary(x509cert.getEncoded()));
System.out.println("-----END CERTIFICATE-----");
} catch (CertificateEncodingException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
在 BouncyCastle 1.60 中PEMWriter已弃用,取而代之的是PemWriter.
StringWriter sw = new StringWriter();
try (PemWriter pw = new PemWriter(sw)) {
PemObjectGenerator gen = new JcaMiscPEMGenerator(cert);
pw.writeObject(gen);
}
return sw.toString();
Run Code Online (Sandbox Code Playgroud)
PemWriter是缓冲的,因此您需要在访问构造它的编写器之前刷新/关闭它。
小智 5
和@Andy Brown几乎一样,少了一行代码。
StringWriter sw = new StringWriter();
try (JcaPEMWriter jpw = new JcaPEMWriter(sw)) {
jpw.writeObject(cert);
}
String pem = sw.toString();
Run Code Online (Sandbox Code Playgroud)
正如他所说,PEMWriter 已被弃用。
| 归档时间: |
|
| 查看次数: |
60454 次 |
| 最近记录: |