我无法使用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。*用作库。
非常感谢任何帮助解决我的问题。
答案 0 :(得分:0)
我发现添加Bouncy Castle作为提供者似乎解决了我的问题。看来JDK默认情况下不支持EC支持。
Security.addProvider(new BouncyCastleProvider());
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");