我在文本文件中有一个证书,其内容如下所示:
-----BEGIN PUBLIC KEY-----
xxxx
xxxx
xxxx
-----END PUBLIC KEY-----
我相信这是Pem编码的证书吗?因此,我现在想加载它,我正在尝试以下操作:
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(
readFileToByteArray("keyfile"));
但我收到一个InvalidKeySpecException。
如果我加载文件,剪切开始/结束页眉/页脚,然后对base64解码“xxxx”的内容,我不会有任何提示:
String contents = readFileToString("keyfile");
contents = contents.replace("-----BEGIN PUBLIC KEY-----", "");
contents = contents.replace("-----END PUBLIC KEY-----", "");
byte[] prepared = Base64.decode(contents);
// ok.
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(prepared);
这是加载 key 文件的正确方法吗?我看到还有一个RSAPublicKeySpec类,根据名称,这似乎是我在这里感兴趣的东西。但是我相信这只是用于生成证书,而不是读取现有证书吗?
谢谢
最佳答案
常见 key 格式here有一个很好的摘要。正如X509EncodedKeySpec的javadocs所指出的那样,此类设计为在X.509标准的SubjectPublicKeyInfo ASN.1结构与Java公钥格式之间进行转换。并且由于第一个链接表明该文件的格式为
确实是SubjectPublicKeyInfo,您正在正确解析文件。您缺少最后一步,那就是将X509EncodedKeySpec转换为公钥。那就是KeyFactory class的功能。要将您的示例再扩展两行,它将是
KeyFactory kf = KeyFactory.getInstance("RSA"); // Assuming this is an RSA key
RSAPublicKey rsaPubKey = (RSAPublicKey) kf.generatePublic(publicKeySpec);