一开始参考的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上上传刚才生成的秘钥对:

文章图片
在命令行中操作:

文章图片
妥了。
=================================================== 20160531 如果使用的秘钥对名字不是id_rsa,e.g.:tunnel_rsa。 在做完互信之后登陆时需要使用如下命令:[root@localhost .ssh]# ssh 'root@192.168.138.132' -i tunnel_rsa。 这是因为id_rsa是默认的名字,如果使用其他名字则需要指定。
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- linux笔记|linux 常用命令汇总(面向面试)
- jvm|【JVM】JVM08(java内存模型解析[JMM])