我试图通过从if_http_client实例化cl_http_client=>create_by_url来使用ABAP的端点。当我不需要使用经过签名的证书时,这个过程可以正常工作。通常,我只包含使用STRUST事务的证书。
但是对于这个特殊情况,我有两个证书文件:.crt和.key。我可以从Postman获取端点,因为我可以在Settings -> Certificates中插入这些文件

那么,我怎样才能让它从ABAP中运行呢?如何在我的http请求中插入这些文件?我应该从ABAP代码中传递它们,还是在STRUST或其他传输中配置它?
发布于 2022-11-26 04:38:13
编辑:随着更多细节的出现,修改后的答案能更好地解决问题。请注意:这是带有SSL的HTTP客户端(而不是服务器)的ABAP。这也是一个非典型的问题。在这里,SAP系统必须使用特定的客户端证书连接到另一个服务,以建立SSL连接。通常在网络级别上管理的东西。
加载证书时,必须将其加载到客户端PSE区域的STRUST中。
前面的想法(在编辑/返工之前)将证书作为标题发送,将其解释为选项3。
备选方案:
1) ABAP中的SSL握手。试图在ABAP中管理SSL握手很可能是不可能的。SSL握手由皂苷sapcryptolib管理。
2)将STRUST中的客户端证书导入标准客户端。详情见下文
( 3)使用xxxx.cer作为字符串,并将其添加为Http报头(最后一种方法,如果选项2不起作用)
==============================================================
2)选项2--详细信息(最佳方法)--将您的证书导入到Standard中。
下面是一个实际案例的标准sap docu的示例。这是荷兰公司的薪资界面。使用私钥证书。*.p12或*.pfx文件。私钥证书
SPV/491c29ac9232469bb257a2ba14ac290c/999ad0ce8bd24945b547584e776e9a4e.html
由于这种类型的证书不能直接导入到SAP中,所以它解释了如何在操作系统级别上使用sapgenpse将p12转换为pse文件。Strust不支持导入p12文件。
现在ABAP调用使用在此步骤中创建的客户端标识。
cl_http_client=>create_by_url(
EXPORTING
url = 'url'
ssl_id = 'CL_ID' "Ident created in step above
IMPORTING
client = lo_client
).或者更容易相处。使用Sm59创建和外部http并选择这个新创建的标识。

然后调用通过目的地创建的http客户端。
CALL METHOD cl_http_client=>create_by_destination
EXPORTING
destination = lv_destination "the new sm59 destination
IMPORTING
client = lo_http_client.“并将实际标识作为HTTP报头传递,”许多服务支持这种方法。但他们的解决方案总是“特定于该服务”。示例是microsoft翻译服务。“期望用户订阅键作为标题。'https://api-eur.cognitive.microsofttranslator.com/translate?api-version=3.0‘
lo_client->request->set_header_field(
EXPORTING
name = 'Client-Cert' "Check HTTP header name with called Service docu
value = '<cert> in string format'
).
"lo_client->send( .. )
"lo_client->receive( .. )发布于 2022-12-02 14:50:40
使用KeyStore资源管理器工具从客户端密钥和证书创建单个pfx文件。此外,您还可以将客户端证书的链与此工具放在一起。
在本地系统上使用皂启,并使用以下命令从pfx文件创建一个pse文件:
sapgenpse import_p12 -p c:\client.pse c:\client.pfx转到STRUST,在Enviroment->SSL客户端标识处创建您自己的证书存储。我更喜欢这个,因为我不把它们都混合在一起。然后返回到STRUST并选择PSE->Import并选择您的自定义pse文件。然后单击PSE->Save并选择您的自定义标识。
将站点SSL证书添加到新标识中。
您可以通过选择新的SSL客户端标识在SM59上尝试新的SSL客户端配置。
下面是ABAP代码示例。
REPORT ZMKY_SSL_CLIENT.
DATA: lo_client TYPE REF TO if_http_client,
lv_code TYPE i,
lv_REASON type string.
cl_http_client=>create_by_url(
EXPORTING
url = 'https://mysslclienthost.com'
ssl_id = 'MYSSLC' "Your SSL Client identity
IMPORTING
client = lo_client
).
lo_client->SEND( ).
lo_client->RECEIVE( ).
lo_client->RESPONSE->GET_STATUS( IMPORTING CODE = lv_code
REASON = lv_reason ).
WRITE: lv_code, lv_reason.https://stackoverflow.com/questions/74577287
复制相似问题