我正在尝试使用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解析错误,而不是序列
下面是我尝试跟进但无法解决的一些其他链接。
JSch getting "invalid privatekey:" while trying to load an RSA private key by KeyPairGenerator
Converting a PEM private key file to a JAVA PrivateKey Object
希望有人可以指引我正确的方向。
谢谢!
答案 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,...)