编辑:重新修订答案以更好地解决问题,随着更多细节的出现。 读者注意:这是使用SSL的ABAP作为HTTP客户端(而不是服务器)。 这也是一个非典型的问题。在这里,SAP系统必须使用特定的客户端证书连接到另一个服务以建立SSL连接。这通常是在网络层管理的。
加载证书时,必须将其加载到客户端PSE区域中的STRUST中。
之前的想法(在编辑/重新修订之前)将证书作为标头发送,解释为选项3。
选项:
1)在ABAP中进行SSL握手。 尝试在ABAP中管理SSL握手很可能是不可能的。 SSL握手由sapcryptolib管理。
2)将客户端证书导入STRUST 到标准客户端PSE。请参阅下面的详细信息
3)使用xxxx.cer作为字符串并添加为Http标头 (如果选项2不起作用,则是最后的选择)
==============================================================
2) 选项2详情(最佳方式) 将您的证书导入Strust,在SSL客户端标准区域。
这里是一个实际案例的标准sap文档示例。 这是Dutsch工资单接口。使用私钥证书。 *.p12或*.pfx文件。私钥证书
由于该类型的证书无法直接导入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.
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( .. )
sapgenpse import_p12 -p c:\client.pse c:\client.pfx
前往STRUST,在“环境” ->“SSL客户端身份”下创建自己的证书存储。我更喜欢这样做,以免混淆所有内容。然后返回STRUST并选择PSE ->导入,选择您的自定义pse文件。然后单击PSE ->另存为,并选择您的自定义身份。
将站点SSL证书添加到您的新身份。
您可以在SM59中尝试使用新的SSL客户端配置,并选择您的新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.