You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenEdge ABL中HTTPS请求SSL失败(错误码0:Unknown SSL error(9318))求助

OpenEdge ABL HTTPS请求SSL错误(9318)的原因及解决方法

问题概述

使用OpenEdge ABL编写的HTTPS请求触发Secure Socket Layer (SSL) failure - error code 0: Unknown SSL error (9318)错误,HTTP请求可正常执行,且Insomnia等第三方REST工具能正常访问该HTTPS接口。

可能原因及解决方法

1. OpenEdge信任库缺失目标服务器CA证书

第三方工具通常自带完整的根证书库,而OpenEdge默认使用独立的证书信任存储,若目标服务器的CA证书未被OE信任,会触发SSL校验失败。

解决步骤:

  • 导出目标服务器的CA证书:通过浏览器访问目标HTTPS地址,查看证书详情,将其导出为PEM或DER格式文件。
  • 将证书添加到OpenEdge信任库:
    • 定位OE安装目录下的certs文件夹(通常为DLC\certs)。
    • 将导出的证书放入该目录。
    • 使用prokey工具导入证书到信任库,执行命令:
      prokey import -file <证书文件名> -db DLC\certs\trusted.pem
      
    • 若使用OE Management控制台,可通过界面操作添加信任证书。

2. OpenEdge不支持目标服务器的SSL/TLS协议版本

部分旧版本OpenEdge默认未启用TLS 1.2/1.3等较新协议,若目标服务器仅支持这些高版本协议,会导致握手失败。

解决步骤:

  • 在创建HTTP客户端时,显式指定允许的SSL/TLS协议版本,修改代码中客户端构建部分:
    oClient = ClientBuilder:Build()
              :SetSSLProtocol("TLSv1.2,TLSv1.3") // 根据服务器实际支持的协议调整
              :Client.
    
  • 安装OpenEdge最新累积补丁,新版本OE对高版本TLS协议支持更完善。

3. 服务器证书主机名不匹配(低概率)

若请求URI的主机名与证书的CN/SAN字段不匹配,OE的SSL校验可能触发错误(部分第三方工具可能放宽此校验)。

解决步骤:

  • 确认请求使用的域名与证书绑定的主机名完全一致,避免使用IP地址访问(若证书仅绑定域名)。

4. OpenEdge加密库依赖异常

OE安装目录下的SSL加密库文件缺失或版本异常,会导致SSL握手失败。

解决步骤:

  • 检查OE安装目录bin下的ssleay32.dll(Windows)或libssl.so(Linux)等文件是否存在。
  • 重新安装OpenEdge或应用最新补丁修复依赖问题。

修改后的示例代码

using OpenEdge.Net.HTTP.*.
using OpenEdge.Net.URI.
using Progress.Json.ObjectModel.*.
using OpenEdge.Net.HTTP.Credentials.

define variable oURI         as URI           no-undo.
define variable oClient      as IHttpClient   no-undo.
define variable oRequest     as IHttpRequest  no-undo.
define variable oResponse    as IHttpResponse no-undo.
define variable oJsonObject  as JsonObject    no-undo.
define variable JsonString   as longchar      no-undo.
define variable oCredentials as Credentials   no-undo.

/* Benutzername und Passwort */
define variable username     as character     no-undo initial 'user4name':U.
define variable password     as character     no-undo initial '4admin':U.

oCredentials = new Credentials('application':U,username,password). 

//Build a request
oURI = URI:Parse('https://dms.com/api/v1/projects/packages':U).                                                               
oRequest = RequestBuilder:Get(oURI):UsingBasicAuthentication(oCredentials):Request.

//Execute a request - 添加SSL协议配置
oClient = ClientBuilder:Build()
          :SetSSLProtocol("TLSv1.2") // 按需调整为支持的协议版本
          :Client.
oResponse = oClient:Execute(oRequest).
    
//Process the response
if oResponse:StatusCode <> 200 then
    return error "Request Error: " + STRING(oResponse:StatusCode).
else
do:
    oJsonObject = cast(oResponse:Entity, JsonObject).
    oJsonObject:Write(JsonString, true).
    message string(JsonString).
end. /* if oResponse:StatusCode <> 200 */

内容的提问来源于stack exchange,提问作者Smokus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:13:09