diff --git a/acme4j-utils/src/main/java/org/shredzone/acme4j/util/KeyPairUtils.java b/acme4j-utils/src/main/java/org/shredzone/acme4j/util/KeyPairUtils.java index f8603646..57e02bb7 100644 --- a/acme4j-utils/src/main/java/org/shredzone/acme4j/util/KeyPairUtils.java +++ b/acme4j-utils/src/main/java/org/shredzone/acme4j/util/KeyPairUtils.java @@ -21,6 +21,7 @@ import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; +import java.security.PublicKey; import java.security.SecureRandom; import org.bouncycastle.jce.ECNamedCurveTable; @@ -123,4 +124,20 @@ public class KeyPairUtils { } } + /** + * Writes a {@link PublicKey} as PEM file. + * + * @param key + * {@link PublicKey} + * @param w + * {@link Writer} to write the PEM file to. The {@link Writer} is closed + * after use. + * @since 3.0.0 + */ + public static void writePublicKey(PublicKey key, Writer w) throws IOException { + try (var jw = new JcaPEMWriter(w)) { + jw.writeObject(key); + } + } + } diff --git a/acme4j-utils/src/test/java/org/shredzone/acme4j/util/KeyPairUtilsTest.java b/acme4j-utils/src/test/java/org/shredzone/acme4j/util/KeyPairUtilsTest.java index cc92b700..cdc6a375 100644 --- a/acme4j-utils/src/test/java/org/shredzone/acme4j/util/KeyPairUtilsTest.java +++ b/acme4j-utils/src/test/java/org/shredzone/acme4j/util/KeyPairUtilsTest.java @@ -140,6 +140,19 @@ public class KeyPairUtilsTest { assertThat(pair).isNotSameAs(readPair); assertThat(pair.getPublic().getEncoded()).isEqualTo(readPair.getPublic().getEncoded()); assertThat(pair.getPrivate().getEncoded()).isEqualTo(readPair.getPrivate().getEncoded()); + + // Write Public Key + String publicPem; + try (var out = new StringWriter()) { + KeyPairUtils.writePublicKey(pair.getPublic(), out); + publicPem = out.toString(); + } + + // Make sure PEM file is properly formatted + assertThat(publicPem).matches( + "-----BEGIN PUBLIC KEY-----[\\r\\n]+" + + "([a-zA-Z0-9/+=]+[\\r\\n]+)+" + + "-----END PUBLIC KEY-----[\\r\\n]*"); } /**