如何在ABAP的if_http_client中绕过SSL认证?
问题:ABAP中如何关闭SSL验证或绕过SSL相关的HTTP通信错误?
核心问题
请问类if_http_client或其他ABAP类中是否存在可关闭SSL验证的方法?因为只有关闭SSL验证时才能正常获取响应,若没有该方法,应如何绕过此错误?
详细背景
使用Postman关闭SSL验证后能成功从https://api-eu.ariba.com/v2/oauth/token获取token,Python中设置禁用SSL验证参数也能成功,但ABAP用if_http_client调用时出现HTTP通信错误,错误信息:
Direct connect to api-eu.ariba.com:443 failed: NIECONN_REFUSED(-10)
Postman配置如下:
- 请求方法:POST
- 请求头:
- Content-Type: application/x-www-form-urlencoded
- Authorization: Basic + API密钥
- 请求体:grant_type: openapi_2lo
已尝试的操作
- 将SAP Ariba EU(RSA)的公钥证书安装到STRUST中;
- 在OA2C_CONFIG中添加OAUTH配置文件,设置token时出现错误:
HTTP failure, processing failed, invalid state, invalid timeout or others Error calling EXECUTE_CC_FLOW.
ABAP代码片段
*Creation of New IF_HTTP_Client Object CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_endpoint ssl_id = 'ANONYM' IMPORTING client = lo_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4. IF sy-subrc IS NOT INITIAL. * Handle errors ENDIF. lo_client->propertytype_logon_popup = 0. *lo_client->request->set_method( if_http_request=>co_request_method_post ). CALL METHOD lo_client->request->set_method( 'POST' ). lo_client->request->set_header_field( name = 'Authorization' value = lv_auth ). lo_client->request->set_header_field( name = 'Content-Type' value = lv_contyp ). lo_client->request->set_form_field( name = 'grant_type' value = lv_grantype ). lo_client->send( ). IF sy-subrc IS NOT INITIAL. * Handle errors ENDIF. CALL METHOD lo_client->receive EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 OTHERS = 4. IF sy-subrc IS NOT INITIAL. lo_client->get_last_error( IMPORTING message = lv_response ). WRITE: / lv_response. IF sy-subrc = 0. ENDIF. ENDIF.
补充信息
尝试将CL_HTTP_CLIENT->CREATE_BY_URL中的DO_NOT_USE_CLIENT_CERT参数改为abap_true,仍无法解决问题。
解决方案
1. ABAP中无直接关闭SSL验证的官方方法
SAP出于安全考量,if_http_client及相关HTTP类未提供直接禁用SSL证书验证的参数或方法。强行绕过会带来安全风险,仅建议测试环境临时使用。
2. 绕过SSL验证的临时方案
方式一:自定义SSL标识跳过证书检查
- 事务码
STRUST创建新SSL客户端标识(如NO_CHECK); - 编辑该标识的"SSL客户端"设置,取消勾选"证书验证";
- 代码中替换
ssl_id参数:
CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_endpoint ssl_id = 'NO_CHECK' " 使用自定义无验证SSL标识 IMPORTING client = lo_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4.
方式二:通过代理中转请求
若无法修改STRUST配置,可将请求通过允许跳过SSL验证的代理发送,代码中添加代理配置:
lo_client->proxy_host = '你的代理服务器地址'. lo_client->proxy_service = '代理端口'.
3. 解决NIECONN_REFUSED(-10)的根本方案
该错误更多是网络连接问题,而非单纯SSL验证问题:
- 事务码
SMICM测试api-eu.ariba.com:443的连通性,或用ping/telnet确认网络可达; - 确认SAP系统是否需通过代理访问外部网络,若需则必须在代码中配置代理参数;
- 检查STRUST中证书是否完整:确保包含完整证书链(含中间证书)、有效期正常,且SSL标识关联正确。
4. OA2C_CONFIG配置建议
若使用OAUTH配置,确保以下步骤正确:
- 选择"客户端凭证"类型(对应openapi_2lo模式);
- 正确填写令牌端点URL(
https://api-eu.ariba.com/v2/oauth/token); - 配置对应Postman中Basic Auth的客户端ID和密钥;
- 测试时确保网络连通、SSL证书配置无误。
内容的提问来源于stack exchange,提问作者user21525821
相关产品推荐
相关产品推荐

