使用java生成SSH密钥

时间:2016-08-01 16:03:55

标签: java ssh putty

我尝试使用以下代码生成SSH密钥

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
         keyPairGenerator.initialize(2048);
         KeyPair keyPair=keyPairGenerator.generateKeyPair();

         RSAPublicKey publicKey=(RSAPublicKey)keyPair.getPublic();
         RSAPrivateKey privateKey=(RSAPrivateKey)keyPair.getPrivate();

         String base64PubKey = Base64.encodeBase64String(publicKey.getEncoded());
         ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
         DataOutputStream dos = new DataOutputStream(byteOs);
         dos.writeInt("ssh-rsa".getBytes().length);
         dos.write("ssh-rsa".getBytes());
         dos.writeInt(publicKey.getPublicExponent().toByteArray().length);
         dos.write(publicKey.getPublicExponent().toByteArray());
         dos.writeInt(publicKey.getModulus().toByteArray().length);
         dos.write(publicKey.getModulus().toByteArray());
         String publicKeyEncoded = new String(
                                    Base64.encodeBase64(byteOs.toByteArray()));
         String key =  "ssh-rsa " + publicKeyEncoded + " ";
         System.out.println("Public Key ------");
         System.out.println(key);


         System.out.println("------------------------------");
         System.out.println("Private key");
         System.out.println(Base64.encodeBase64(privateKey.getEncoded()));

现在,当我将私钥内容存储在文件中并尝试使用putty验证它时,它表示私钥的格式无效。

你们可以帮我解决这个问题吗,有些我错过了私钥格式,因此putty没有认出来。

2 个答案:

答案 0 :(得分:1)

Putty无法识别OpenSSH格式的密钥 - 必须首先使用Puttygen将它们转换为Putty样式。

这个转换有一个Debian / Ubuntu包:

apt-get install putty-tools
puttygen openssh_formattted_key -o putty_formatted_key.ppk

可能能够对此进行调查,并弄清楚如何转换密钥,或者从代码中将该命令作为一个进程运行。


在Windows上,Puttygen GUI可用于此:

https://devops.profitbricks.com/tutorials/use-ssh-keys-with-putty-on-windows/

下载链接:https://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe

如果你想直接使用这个密钥生成 ,我建议你使用像MINGW32 / MINGW64,Cygwin等那样的东西,你可以在命令提示符或其他终端中使用ssh命令像窗户。

答案 1 :(得分:1)

如上所述,putty仅使用自己的PPK'格式可以通过 puttygen 进行转换 - 但仅限于'商业' SSH.com格式(此处不适用)以及OpenSSH(6.5之前)使用的格式,即'遗产'格式最初由OpenSSL使用, NOT OpenSSL自2000年以来使用的PKCS8 standard格式并由Java加密使用。

(1)如果您已经或可以获得BouncyCastle,请参阅How can I export a (PKCS#8?) private key in Putty or Puttygen readable format?创建一个可以读入puttygen的文件。

(2)否则,如果您已经或可以获得openssl命令行,请在Java 中使用正确的' 编写PKCS8,其中base64 包含19个组的换行符(类型PRIVATE KEY(不是RSA PRIVATE KEY也不是ENCRYPTED PRIVATE KEY)的76个字符或更少以及标题和预告片,然后通过openssl rsa运行(不是{{1转换为遗产,并将其读入puttygen。

(3)否则你的选择不太好。可能最好的方法是打开PKCS8格式以获得“遗产”#39;格式如下:

openssl pkey

将该输出放入文件并读入puttygen。