java|在JAVA中生成RSA秘钥对实现SSH互信

一开始参考的http://blog.csdn.net/wangqiuyun/article/details/42143957这篇文章,后来发现文中使用的是java.security.KeyPair,生成的秘钥对不符合互信的要求。 于是换用com.jcraft.jsch.JSch,官网是http://www.jcraft.com/jsch/,也可以通过maven引入。具体代码如下:

public static Map getKeyMap(String comment) { Map keys = new HashMap<>(); int type = KeyPair.RSA; JSch jsch = new JSch(); try { KeyPair kpair = KeyPair.genKeyPair(jsch, type); //私钥 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //向OutPutStream中写入 kpair.writePrivateKey(baos); String privateKeyString = baos.toString(); //公钥 baos = new ByteArrayOutputStream(); kpair.writePublicKey(baos, comment); String publicKeyString = baos.toString(); System.out.println("Finger print: " + kpair.getFingerPrint()); kpair.dispose(); // 得到公钥字符串 //String publicKeyString = RSAEncrypt.loadPublicKeyByFile(filePath,filename + ".pub"); //System.out.println(publicKeyString.length()); System.out.println(publicKeyString); keys.put("publicKey", publicKeyString); // 得到私钥字符串 //String privateKeyString = RSAEncrypt.loadPrivateKeyByFile(filePath,filename); //System.out.println(privateKeyString.length()); System.out.println(privateKeyString); keys.put("privateKey", privateKeyString); } catch (Exception e) { System.out.println(e); } return keys; }



分析两者生成的秘钥对的区别,在于jsch生成的私钥有另起一行的“-----BEGIN RSA PRIVATE KEY-----”开头和“-----END RSA PRIVATE KEY-----”结尾,并且正文部分每隔64个字符换行一次。

而公钥则多了“ssh-rsa ”开头,并且在结尾部分可以添加注释。
接下来开始做互信。
在机器A上上传刚才生成的秘钥对:
java|在JAVA中生成RSA秘钥对实现SSH互信
文章图片

在命令行中操作:
java|在JAVA中生成RSA秘钥对实现SSH互信
文章图片

妥了。
=================================================== 20160531 如果使用的秘钥对名字不是id_rsa,e.g.:tunnel_rsa。 在做完互信之后登陆时需要使用如下命令:[root@localhost .ssh]# ssh 'root@192.168.138.132' -i tunnel_rsa。 这是因为id_rsa是默认的名字,如果使用其他名字则需要指定。

    推荐阅读