【发布时间】:2015-09-15 10:26:09
【问题描述】:
我已经使用 ssh-keygen -t rsa 生成了公钥-私钥
以下是我的公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtbGPZjdnMWk8lJ/CdaBZROCtNk8H+Ru4keC7DK55q2t2ISRgjBaR4qZnWezAA2iJX3cwq2ulfwCPmyoc0G180lUEMDkZkeuWzyvwWjZIo0cehN2j28evgpZadfe+NxYYqQ2f7/3eJ+3IwT4EE6WmzaYjsYXloilJLVJFBbPkdy+1xnHAa1RXsdDNjMPQ9d9PSdr9BYlph21lzflk5wdBxXnLxzUD3mb3j0cCMrIl7IF2CbkKnBC4VFZahRRyJLBWvXvcxXR7Pspv6/WUE2GsZZ3GynAhS7LuHk7NKmB13+lQFejDGO4yVsXQLw7dg+JsIs4h3JkindgJRUytQq7lZ user@Ganesh-VirtualBox
这是我获取公钥的代码
public static PublicKey getPublicKey(String filename)
throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int)f.length()];
dis.readFully(keyBytes);
dis.close();
X509EncodedKeySpec spec =
new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
我将正确的文件名传递给此方法。 kf.generatePublic(spec) 行抛出错误,如下所示。
Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)
at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
为什么会出现这个错误?
【问题讨论】:
-
SSH 密钥未在 X509 中编码。请参阅stackoverflow.com/questions/12749858/rsa-public-key-format 的答案。
-
OpenSSH 的最新版本应该能够以“X.509”(实际上是 SPKI)PEM 格式输出公钥,其名称为
ssh-keygen -e -m PKCS8。 Java 无法在此处处理 PEM,因此要么(1)删除标志行并将 base64 转换为二进制 DER,要么(2)使用openssl rsa -pubin -in pemfile -out derfile -outform der。或者,OpenSSH 默认使用与 OpenSSL 兼容的 PEM 格式作为 private 密钥,因此给定私钥id_rsa只需执行openssl rsa -in id_rsa -pubout -out publicderfile -outform der。在 OpenSSL 1.0.0+ 中,您可以使用pkey而不是rsa。
标签: java encryption rsa public-key-encryption