从字符串创建RSA公钥时抛出InvalidKeySpecException异常求助
解决InvalidKeySpecException:公钥与证书混淆问题
核心问题很明确:你代码里的AppKeyPub是X.509证书的Base64内容,不是openssl rsa -pubout生成的RSA公钥内容,这就是导致KeyFactory.generatePublic()抛出异常的原因。
怎么区分两者?
openssl rsa -pubout生成的public-key.pem开头是:-----BEGIN PUBLIC KEY------ 而自签名证书
cert.pem开头是:-----BEGIN CERTIFICATE-----
你当前用的是证书的内容,不是公钥,自然无法用X509EncodedKeySpec解析成公钥。
两种解决办法
办法一:使用正确的RSA公钥内容
- 打开你生成的
public-key.pem文件 - 去掉首尾的
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----标记行 - 将中间的Base64字符串拼接成一个连续的字符串,替换到Java代码的
AppKeyPub中
修正后的代码示例:
private void prepKeys() { // 替换成public-key.pem里的Base64内容 String AppKeyPub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." + "..."; try { KeyFactory kFactory = KeyFactory.getInstance("RSA"); byte[] decoded = Base64.getDecoder().decode(AppKeyPub); X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded); PublicKey publicKey = kFactory.generatePublic(spec); System.out.println("Public Key: " + publicKey); } catch (Exception e) { e.printStackTrace(); } }
办法二:从证书中提取公钥(如果确实需要用证书内容)
如果你手里只有证书文件,不想重新取公钥,可以用Java的CertificateFactory解析证书,再提取公钥:
private void prepKeysFromCert() { String certBase64 = "MIIFKzCCA5OgAwIBAgIUGRbwEi8QEl2q+5h9wQ8P5guIMuEwDQYJKoZIhvcNAQEL" + "..."; // 你当前的AppKeyPub内容 try { CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); byte[] decodedCert = Base64.getDecoder().decode(certBase64); X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(decodedCert)); PublicKey publicKey = cert.getPublicKey(); System.out.println("Public Key from Cert: " + publicKey); } catch (Exception e) { e.printStackTrace(); } }
额外检查项
- 确保Base64字符串没有多余的换行、空格或特殊字符
- 确认OpenSSL生成的公钥是RSA类型(你用的
genrsa命令没问题,是RSA密钥)
内容的提问来源于stack exchange,提问作者Vara Lakshmi
相关产品推荐
相关产品推荐

