SAP CPI:使用公钥身份验证通过Groovy进行SFTP连接

2020-08-14 04:43发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中) 已解决的问题:通过groovy...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


已解决的问题:通过groovy(JSch)在SFTP连接中访问和使用私钥(id_rsa)

已改造的问题::通过常规脚本而不使用SFTP适配器连接到SFTP服务器时,如何使用公钥身份验证。

业务案例::我的客户有多个带有多个SFTP服务器的第三方系统。 我需要开发一个中央CPI接口,该接口将充当中间人,以将文件从任何来源传输到任何目的地。

解决方案设计:我的设计如下

1。 维护一个配置文件,其中包含源->目标和计划组合的各种列表。

2。 接口将使用SFTP适配器从默认的SFTP服务器读取此配置文件,获取源和目标组合,并开始一个接一个地处理它。

3。 现在,一旦有了源和目标,就需要在iFlow的中间进行另一个SFTP调用。 可以在脚本中轻松使用JSch类来完成此操作。 https: //blogs.sap.com/2018/04/17/access-file-from-sftp-server-in-middle-of-an-iflow/-感谢Shashank Kesarwani

4。 但是,如果使用公共密钥身份验证,如何从密钥库中获取公共密钥并将其添加到JSch隧道中。

到目前为止的进展:

1。 我设法获得了KeystoreService

com.sap.it.api.keystore.KeystoreService ks = com.sap.it.api.ITApiFactory.getApi(com.sap.it.api.keystore.KeystoreService.class,空)

2。 当我使用getKey方法时,

def privateKey = ks.getKey(" id_rsa");

我得到的原始X.509格式的密钥是这样的:(这就是我想的那样!)

RSA私钥(2048位):

模量:

公共指数:10001

私有指数:

primeP:

primeQ:

primeExponentP:

primeExponentQ:

crt_coefficient:

3。 但是,如果必须使用JSch类通过Groovy使用公共密钥身份验证,则需要添加密钥 IN OPENSSH FORMAT 作为身份

jsch.addIdentity(" id_rsa", private_key.getBytes(),public_key.getBytes(),emptyPassPhrase);

所需格式:

-RSA私钥的开始-

-RSA私钥的结尾-

问题:如何在脚本本身中将 原始X.509格式的私钥转换为OPENSSH格式?

6条回答
Doze时光
2020-08-14 05:12

经过一些研究,发现了如何做。

1。 获取KeystoreService

 com.sap.it.api.keystore.KeystoreService ks = com.sap.it.api.ITApiFactory.getApi(com.sap.it.api.keystore.KeystoreService.class,空)

2。 使用getKey方法获取私钥/公钥

 def privateKey = ks.getKey(" id_rsa"); 

3。 获取密钥的编码部分

 byte [] getEncoded = privateKey.getEncoded()

4。 将密钥的编码部分转换为OpenSSH格式

//** -------------------------------------------  --------------------------------------------------  ----------------- **
//获取私钥
 def privateKey = keyPair.getPrivate();
 getEncoded = privateKey.getEncoded()
  
 privateKeyPem = Base64.getEncoder()。encode(getEncoded);
 privateKeyPemStr =新的String(privateKeyPem);
        
 privateKeyPemStrFinal =" ----- BEGIN RSA PRIVATE KEY -----";
 int列= 0;
 for(int n = 0; n 
 

privateKeyPemStr将具有正确格式的密钥

一周热门 更多>