1import java.io.InputStream;
2import java.nio.charset.StandardCharsets;
3import java.nio.file.Files;
4import java.nio.file.Path;
5import java.security.MessageDigest;
6import java.security.PublicKey;
7import java.security.cert.CertificateFactory;
8import java.security.cert.X509Certificate;
9import java.util.Base64;
10import java.util.HexFormat;
11
12public class ExtractKey {
13 public static void main(String[] args) throws Exception {
14 X509Certificate cert;
15 try (InputStream in = Files.newInputStream(Path.of("cert.pem"))) { // PEM or DER
16 cert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(in);
17 }
18 PublicKey publicKey = cert.getPublicKey();
19 byte[] spki = publicKey.getEncoded(); // SubjectPublicKeyInfo DER; getFormat() says "X.509"
20
21 String body = Base64.getMimeEncoder(64, "\n".getBytes(StandardCharsets.US_ASCII)).encodeToString(spki);
22 String pem = "-----BEGIN PUBLIC KEY-----\n" + body + "\n-----END PUBLIC KEY-----\n";
23 Files.writeString(Path.of("pub.pem"), pem);
24 System.out.print(pem);
25
26 byte[] digest = MessageDigest.getInstance("SHA-256").digest(spki);
27 System.out.println("SPKI SHA-256: " + HexFormat.ofDelimiter(":").formatHex(digest));
28 System.out.println("SPKI pin (base64): " + Base64.getEncoder().encodeToString(digest));
29 System.out.println("algorithm " + publicKey.getAlgorithm() + ", format " + publicKey.getFormat());
30 }
31}
32