2015-09-15 103 views
0

我已经生成使用ssh-keygen -t rsa加密使用公开私钥

公私密钥以下是我的公钥

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtbGPZjdnMWk8lJ/CdaBZROCtNk8H+Ru4keC7DK55q2t2ISRgjBaR4qZnWezAA2iJX3cwq2ulfwCPmyoc0G180lUEMDkZkeuWzyvwWjZIo0cehN2j28evgpZadfe+NxYYqQ2f7/3eJ+3IwT4EE6WmzaYjsYXloilJLVJFBbPkdy+1xnHAa1RXsdDNjMPQ9d9PSdr9BYlph21lzflk5wdBxXnLxzUD3mb3j0cCMrIl7IF2CbkKnBC4VFZahRRyJLBWvXvcxXR7Pspv6/WUE2GsZZ3GynAhS7LuHk7NKmB13+lQFejDGO4yVsXQLw7dg+JsIs4h3JkindgJRUytQq7lZ [email protected] 

这是我的代码,让我的公钥

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) 

为什么我得到这个错误?

+3

SSH密钥不在X509中编码。请参阅http://stackoverflow.com/questions/12749858/rsa-public-key-format上的答案。 – hexafraction

+1

最近版本的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'。 –

回答

1

通常,公钥以X.509格式需要,私钥在PKCS#8格式中是必需的。所以,无论何时您处理公钥/私钥,都需要确保它们的格式合适。

Oracle docs

所以阅读下面的,首先你需要一个关键指标。可以获取通过 一个以下,假设密钥根据X.509标准 ,这是这种情况,例如,如果被产生的密钥与 编码内置的DSA密钥对发生器由SUN提供者提供:

主要错误你正在为InvalidKeyExceptionsays

这是无效键除外(无效编码,错 长度,未初始化等)。

现在在你的情况下,它是无效的编码,导致这个错误,因为你使用生成的公钥清除,而不是使其与X509EncodedKeySpec兼容。因此,解决您的问题首先按照X.509标准编码您的公钥,以便您可以使用X509EncodedKeySpec