主要问题就在于此。将openssh
公钥解析为rfc 4716
格式。但唯一的问题是它必须在 java 。
使用ssh-keygen
,它只是单行命令:
ssh-keygen -e -f openssh_key.pub
不幸的是,我无法在Java中找到任何其他来源。甚至没有提到转换所需的任何算法或步骤。所有这些都围绕着ssh-keygen
本身的使用。当然,我可以使用java.exec
来调用命令,但这是最糟糕的情况。
示例openssh密钥(已将其保留为代码格式,以便保留生成的空格/换行符):
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDwxgE7D3HYLYddNHLMFK8OfpRwwUSgxiB8fbecvkCUEktSpWikvsWTyCnl5p3uSmsGg/F1lwVPXuuVlQ4VZlYqMuEBEMRF9ADdXWWNxjO/Hd7688ow7ocncxl0xKXsH5Fc9GHvE8yfUh94F8Qm9x8M8Uux+XsNEvPG8KI/QUJWndIsHv+m//3nbEEqUTAlzsyY0mjHW/dPORhXcB5WeGH+cBRAhcp5JGKAq26TOsuNY8H+nrlxX6z03xbUN28HHdXv6uKZfpnVpl6tM0khxbh7F+tLYWeUIZ+nYaDBPINv8Mkd6Duqe/GOLtgVUIR76Adijok4w5oaKlTq27xzMurl kaushik@kaushik-HP
使用ssh-keygen解析:
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by kaushik@kaushik-HP from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQDwxgE7D3HYLYddNHLMFK8OfpRwwUSgxiB8fbecvk
CUEktSpWikvsWTyCnl5p3uSmsGg/F1lwVPXuuVlQ4VZlYqMuEBEMRF9ADdXWWNxjO/Hd76
88ow7ocncxl0xKXsH5Fc9GHvE8yfUh94F8Qm9x8M8Uux+XsNEvPG8KI/QUJWndIsHv+m//
3nbEEqUTAlzsyY0mjHW/dPORhXcB5WeGH+cBRAhcp5JGKAq26TOsuNY8H+nrlxX6z03xbU
N28HHdXv6uKZfpnVpl6tM0khxbh7F+tLYWeUIZ+nYaDBPINv8Mkd6Duqe/GOLtgVUIR76A
dijok4w5oaKlTq27xzMurl
---- END SSH2 PUBLIC KEY ----
更新:我为有类似需求的人创建了implementation of the conversion on gist。
答案 0 :(得分:2)
两种格式的Base64数据完全相同 - 您不需要做任何花哨的事情。您需要做的就是在这些格式之间进行转换,添加/删除换行符(70个字符)并更改标题/预告片。
请注意,这两种格式在OpenSSH键中都有注释 - kaushik@kaushik-HP
,在PEM键中以Comment:
开头。两者都是完全可选的,不需要转换。
答案 1 :(得分:0)
好吧,我不知道我是应该笑还是哭,因为我终于找到了我需要的确切功能,以及JSch library中的更多功能。在我为转换编写my own implementation后,这是当然的。因此,我对笑/哭的情况感到困惑。但就目前而言,我很高兴在这个过程中学到了新的东西。
使用JSch's KeyPair class
的一个小例子:
生成私钥 - 公钥对(RSA):
JSch jSch = new JSch();
KeyPair keyPair = KeyPair.genKeyPair(jSch, KeyPair.RSA);
keyPair.writePrivateKey("privateKey"); //store private key in file - 'privateKey'
keyPair.writePublicKey("publicKey"); //store public key in file - 'publickKey'
将公钥转换为RFC 4716格式。
keyPair.writeSECSHPublicKey("ssh2Key"); //store ssh2 public key in file - 'ssh2Key'
答案 2 :(得分:0)
基于黄昏的答案,这是我编写的用于进行转换的代码:
public String convert(String rsaKey){
String[] keyParts = rsaKey.split("\\s"); // header + content + comment
if(keyParts.length < 2 || !keyParts[0].equals("ssh-rsa"))
throw new IllegalArgumentException("The key "+rsaKey+" is not a properly formatted RSA key.");
StringBuilder sb = new StringBuilder("---- BEGIN SSH2 PUBLIC KEY ----\n");
final int rowLength = 70;
final String keyContent = keyParts[1];
for(int i=0; i*rowLength < keyContent.length(); i++){
sb.append(keyContent, i*rowLength, Math.min((i+1)*rowLength, keyContent.length())).append('\n');
}
sb.append("---- END SSH2 PUBLIC KEY ----");
return sb.toString();
}