将openssh公钥转换为ssh2(RFC 4716)格式

时间:2018-03-07 05:44:45

标签: java openssh

主要问题就在于此。将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

3 个答案:

答案 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();
}