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控制台,可通过界面操作添加信任证书。
- 定位OE安装目录下的
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
相关产品推荐
相关产品推荐

