如何使用 JSch 库将 PEM 文件转换为 ssh 到 ec2 的字符串
How can I convert PEM file to string for ssh to ec2 using JSch library
我正在尝试使用来自 Java 代码的 JSch 库通过 SSH 连接到 EC2。我在 SO How can I use .pem files content as a string in ec2 connection using JSch library 中提到了这个 link 并尝试了下面提到的一些事情但没有成功。有人可以指导我如何实现我的 objective 吗?
Objective
我有一个这样的 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-----
对于我的 objective,我认为我的 addIdentity
方法应该是这样的:
addIdentity ("username","{privatekey string converted to byte array}",null, null)
我想了解该字符串是如何形成的?我对密码学很陌生,但在这个过程中我了解到,由于我的 PEM 具有 BEGIN RSA PRIVATE KEY
,因此它是 PKCS1 格式。 JSch 是否支持 PKCS1 格式或需要转换为 PKSC8?
其次,我了解到正文是用Base64编码的,所以我什至尝试在剥离所有回车returns、页眉和页脚后用Base64解码字符串,这给了我这样的错误
Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
下面是我尝试跟进但未能解决的一些额外 link。
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
希望有人能指导我正确的方向。
谢谢!
我找到了答案。
下面post给了我一个方向
JSch: addIdentity from private key stored on hdfs
对于希望解决类似需求的任何其他人,请确保您没有剥离页眉、页脚信息。这花费了我大部分时间来调试,因为大多数 blogs/SO post 都是针对剥离这些字符的。在 Java 中,您的字符串必须包含回车符 returns 否则您可能会得到一个非常不同的字节数组。
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,...)
我正在尝试使用来自 Java 代码的 JSch 库通过 SSH 连接到 EC2。我在 SO How can I use .pem files content as a string in ec2 connection using JSch library 中提到了这个 link 并尝试了下面提到的一些事情但没有成功。有人可以指导我如何实现我的 objective 吗?
Objective
我有一个这样的 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-----
对于我的 objective,我认为我的 addIdentity
方法应该是这样的:
addIdentity ("username","{privatekey string converted to byte array}",null, null)
我想了解该字符串是如何形成的?我对密码学很陌生,但在这个过程中我了解到,由于我的 PEM 具有 BEGIN RSA PRIVATE KEY
,因此它是 PKCS1 格式。 JSch 是否支持 PKCS1 格式或需要转换为 PKSC8?
其次,我了解到正文是用Base64编码的,所以我什至尝试在剥离所有回车returns、页眉和页脚后用Base64解码字符串,这给了我这样的错误
Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
下面是我尝试跟进但未能解决的一些额外 link。
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
希望有人能指导我正确的方向。
谢谢!
我找到了答案。 下面post给了我一个方向
JSch: addIdentity from private key stored on hdfs
对于希望解决类似需求的任何其他人,请确保您没有剥离页眉、页脚信息。这花费了我大部分时间来调试,因为大多数 blogs/SO post 都是针对剥离这些字符的。在 Java 中,您的字符串必须包含回车符 returns 否则您可能会得到一个非常不同的字节数组。
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,...)