从X509证书中提取ECPublicKey

时间:2018-03-05 01:26:10

标签: java public-key ecdsa

我无法使用Java从X509证书中提取ECPublicKey。

密钥和证书创建如下

ssh-keygen -t ecdsa -f id_ecdsa
openssl pkcs8 -topk8 -in id_ecdsa -out id_ecdsa.p8
openssl req -new x509 -key id_ecdsa.p8 -out id_ecdsa.crt.der -outform der

用于从证书中提取公钥的代码是

FileInputStream fin = new FileInputStream("<path to id_ecdsa.crt.der>");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(fin);
PublicKey pk = cert.getPublicKey();

if (pk instanceof ECPublicKey) {
  ECPublicKey key = (ECPublicKey) pk;
  ...
} else if (pk instanceof RSAPublicKey) {
  RSAPublicKey key = (RSAPublicKey) pk;
  ...
}

对于包含RSA密钥的证书,一切正常。但是,如果使用ECDSA密钥,则忽略if(pk instanceof ECPublicKey)块。

对pk.getAlgorithm()的调用会产生“EC”,表示密钥是ECDSA密钥。

使用调试器检查pk会为ECDSA生成类型X509Key。对于RSA密钥,调试器产生RSAPublicKeyImpl。

N.B。 java.security。*用作库。

非常感谢任何帮助解决我的问题。

1 个答案:

答案 0 :(得分:0)

我发现添加Bouncy Castle作为提供者似乎解决了我的问题。看来JDK默认情况下不支持EC支持。

Security.addProvider(new BouncyCastleProvider());
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");