如何使用JSch库将PEM文件转换为ssh到ec2的字符串

时间:2018-06-23 14:57:26

标签: java cryptography rsa jsch pem

我正在尝试使用Java代码中的JSch库将SSH SSH到EC2。我在SO How can I use .pem files content as a string in ec2 connection using JSch library中引用了此链接,并尝试了以下一些尝试,但徒劳无功。有人可以指导我如何实现我的目标吗?

客观

我有一个这样的PEM文件。我不想将我的PEM文件存储在AWS中的任何位置,因此我的方法是提取一个等效字符串,我可以对其进行编码和存储在数据库中,然后从Java对其进行解码,以将参数传递给采用以下参数的addIdentity方法:

addIdentity(String name, byte[] prvkey, byte[] pubkey, byte[] passphrase)
    throws JSchException
-----BEGIN RSA PRIVATE KEY-----
MIIepsdfAIBAAKCAQEAtBk068z
...
xVNdhlDy6asdk9wsdQ==
-----END RSA PRIVATE KEY-----

出于我的目标,我相信我的addIdentity方法将是这样的:

addIdentity ("username","{privatekey string converted to byte array}",null, null)

我试图了解该字符串如何形成?我是密码技术的新手,但是在此过程中,我了解到由于PEM具有BEGIN RSA PRIVATE KEY,因此它是PKCS1格式。 JSch是否支持PKCS1格式,或者需要将其转换为PKSC8?

第二,我了解到主体是用Base64编码的,因此我什至在剥离所有回车符,页眉和页脚后甚至尝试用Base64解码字符串,这给了我这样的错误

  

线程“ main”中的异常java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:algid解析错误,而不是序列

下面是我尝试跟进但无法解决的一些其他链接。

希望有人可以指引我正确的方向。

谢谢!

1 个答案:

答案 0 :(得分:1)

我想出了答案。 下面的帖子给了我指示。

JSch: addIdentity from private key stored on hdfs

对于希望解决类似要求的其他任何人,请确保您没有剥离页眉,页脚信息。我花了大部分时间进行调试,因为大多数博客/ SO帖子都针对剥离这些字符。在Java中,您的字符串必须带有回车符,否则可能会获得完全不同的字节数组。

String  x = "-----BEGIN RSA PRIVATE KEY-----\r\n" + 
            "MIIEpAIBAAKCAQEAtBk\Q/z4QAgk+LN3IUajqjUv7IucsCd4SebbQvah5t4WJ\r\n"

使用“ US-ASCII”字符集将字符串转换为字节数组。如果您没有密码短语,请使用以下JSch方法:

jsch.addIdentity("username",{bytearray of x},null, null)

注意:确保您传递的是无符号字节数组,例如:
数组(45,45,69,...)
而不是
数组(45,-35,-125,...)