Add a method to read a X509Certificate

pull/17/merge
Richard Körber 2015-12-20 22:45:58 +01:00
parent 9e93327818
commit 19ce2328ea
2 changed files with 41 additions and 11 deletions

View File

@ -14,7 +14,12 @@
package org.shredzone.acme4j.util; package org.shredzone.acme4j.util;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer; import java.io.Writer;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import org.bouncycastle.openssl.jcajce.JcaPEMWriter; import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
@ -32,6 +37,34 @@ public final class CertificateUtils {
// utility class without constructor // utility class without constructor
} }
/**
* Reads an {@link X509Certificate} PEM file from an {@link InputStream}.
*
* @param in
* {@link InputStream} to read the certificate from.
* @return {@link X509Certificate} that was read
*/
public static X509Certificate readX509Certificate(InputStream in) throws IOException {
try (InputStream uin = in) {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
return (X509Certificate) certificateFactory.generateCertificate(uin);
} catch (CertificateException ex) {
throw new IOException(ex);
}
}
/**
* Writes an X.509 certificate PEM file.
*
* @param cert
* {@link X509Certificate} to write
* @param out
* {@link OutputStream} to write the PEM file to
*/
public static void writeX509Certificate(X509Certificate cert, OutputStream out) throws IOException {
writeX509Certificate(cert, new OutputStreamWriter(out, "utf-8"));
}
/** /**
* Writes an X.509 certificate PEM file. * Writes an X.509 certificate PEM file.
* *

View File

@ -17,9 +17,9 @@ import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.StringWriter;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
@ -44,12 +44,12 @@ public class CertificateUtilsTest {
} }
/** /**
* Test if * Test if {@link CertificateUtils#readX509Certificate(InputStream)} reads and
* {@link CertificateUtils#writeX509Certificate(X509Certificate, java.io.Writer)} * {@link CertificateUtils#writeX509Certificate(X509Certificate, java.io.Writer)}
* writes a proper X.509 certificate. * writes a proper X.509 certificate.
*/ */
@Test @Test
public void testWriteX509Certificate() throws IOException, CertificateException { public void testReadWriteX509Certificate() throws IOException, CertificateException {
// Read a demonstration certificate // Read a demonstration certificate
X509Certificate original; X509Certificate original;
try (InputStream cert = getClass().getResourceAsStream("/cert.pem")) { try (InputStream cert = getClass().getResourceAsStream("/cert.pem")) {
@ -58,23 +58,20 @@ public class CertificateUtilsTest {
assertThat(original, is(notNullValue())); assertThat(original, is(notNullValue()));
// Write to StringWriter // Write to StringWriter
String pem; byte[] pem;
try (StringWriter out = new StringWriter()) { try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
CertificateUtils.writeX509Certificate(original, out); CertificateUtils.writeX509Certificate(original, out);
pem = out.toString(); pem = out.toByteArray();
} }
// Make sure it is a good PEM file // Make sure it is a good PEM file
assertThat(pem, RegexMatchers.matchesPattern( assertThat(new String(pem, "utf-8"), RegexMatchers.matchesPattern(
"-----BEGIN CERTIFICATE-----[\\r\\n]+" "-----BEGIN CERTIFICATE-----[\\r\\n]+"
+ "([a-zA-Z0-9/+=]+[\\r\\n]+)+" + "([a-zA-Z0-9/+=]+[\\r\\n]+)+"
+ "-----END CERTIFICATE-----[\\r\\n]*")); + "-----END CERTIFICATE-----[\\r\\n]*"));
// Read it back in // Read it back in
X509Certificate written; X509Certificate written = CertificateUtils.readX509Certificate(new ByteArrayInputStream(pem));
try (InputStream cert = new ByteArrayInputStream(pem.getBytes("utf-8"))) {
written = (X509Certificate) certificateFactory.generateCertificate(cert);
}
// Verify that both certificates are the same // Verify that both certificates are the same
assertThat(original.getEncoded(), is(equalTo(written.getEncoded()))); assertThat(original.getEncoded(), is(equalTo(written.getEncoded())));