在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中生成RSA秘钥对实现SSH互信_第1张图片
在命令行中操作
在JAVA中生成RSA秘钥对实现SSH互信_第2张图片
妥了。
===================================================
20160531
如果使用的秘钥对名字不是id_rsa,e.g.:tunnel_rsa。
在做完互信之后登陆时需要使用如下命令:[root@localhost .ssh]# ssh '[email protected]' -i tunnel_rsa。
这是因为id_rsa是默认的名字,如果使用其他名字则需要指定。

你可能感兴趣的:(java,linux)