How do I get the 'pub' info from an EC certificate in Java?

76 Views Asked by At

How can I print the public key info of an EC certificate in Java without reverting to calling openssl?

When I print an EC certificate using openssl I get something like the following:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: C = US, ST = CA, L = PA, O = BC, OU = VCF, CN = no-ku-test-host
        Validity
            Not Before: Feb 23 17:58:00 2024 GMT
            Not After : Feb 23 17:58:00 2124 GMT
        Subject: C = US, ST = CA, L = PA, O = BC, OU = VCF, CN = no-ku-test-host
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:                                                      <<
                    04:7a:ef:a5:53:5a:f7:a4:15:a9:ca:5a:63:6b:c9:         <<
                    f7:d3:1a:22:c0:71:df:01:dc:ff:62:c8:aa:97:f6:         <<
                    66:52:a4:31:08:d2:a5:5b:d5:6e:54:25:fc:89:d3:         <<
                    0c:c2:95:1c:94:a6:96:e7:e8:b2:5e:fc:f7:48:5d:         <<
                    42:3a:ca:81:79                                        <<
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
    Signature Algorithm: ecdsa-with-SHA256
         30:46:02:21:00:e1:e7:ad:57:e6:f8:ad:50:d2:0e:5d:b3:8b:
         62:31:9c:95:d3:48:d6:c9:ba:89:20:89:4f:c8:1e:1d:86:a7:
         a6:02:21:00:a4:c2:5a:e0:d6:34:27:ed:dc:d7:05:4d:43:a9:
         77:0b:90:15:26:c8:3c:95:df:c4:2f:5d:53:6a:87:21:43:e5

I know how to read and parse the PEM in Java and obtain the ECPublicKey object. In it it has an ECParameter containing its ECPoint object. But how do I get the 64-byte public-key info marked above as printed by openssl from all this information?

I want to avoid having to call openssl from Java to get to this information. It seems it must be possible somehow, doing some computation on the data in the above data-structures.

Here is the PEM for the above certificate:

-----BEGIN CERTIFICATE-----
MIIBzDCCAXGgAwIBAgIBATAKBggqhkjOPQQDAjBcMQswCQYDVQQGEwJVUzELMAkG
A1UECBMCQ0ExCzAJBgNVBAcTAlBBMQswCQYDVQQKEwJCQzEMMAoGA1UECxMDVkNG
MRgwFgYDVQQDEw9uby1rdS10ZXN0LWhvc3QwIBcNMjQwMjIzMTc1ODAwWhgPMjEy
NDAyMjMxNzU4MDBaMFwxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTELMAkGA1UE
BxMCUEExCzAJBgNVBAoTAkJDMQwwCgYDVQQLEwNWQ0YxGDAWBgNVBAMTD25vLWt1
LXRlc3QtaG9zdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHrvpVNa96QVqcpa
Y2vJ99MaIsBx3wHc/2LIqpf2ZlKkMQjSpVvVblQl/InTDMKVHJSmlufosl7890hd
QjrKgXmjIjAgMAkGA1UdEwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCgYIKoZI
zj0EAwIDSQAwRgIhAOHnrVfm+K1Q0g5ds4tiMZyV00jWybqJIIlPyB4dhqemAiEA
pMJa4NY0J+3c1wVNQ6l3C5AVJsg8ld/EL11TaochQ+U=
-----END CERTIFICATE-----
0

There are 0 best solutions below