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

Progress 4GL 11.7.4版本HTTPS请求SSL报错解决方案咨询

解决OpenEdge 11.7.4 HTTPS请求SSL错误(错误码17424)的方案

针对你在OpenEdge 11.7.4中因多子域名导致的SSL SNI缺失问题,以下是几种可行的解决方式:

方案1:尝试通过环境变量启用SNI

OpenEdge部分旧版本支持通过环境变量强制开启SNI功能,在启动程序前设置:

SET PRO_SSL_SNI_ENABLE=1

设置完成后重新运行请求代码,验证是否自动发送SNI标识。

方案2:优化SSL验证配置(临时测试用)

如果允许降低安全级别,可以尝试更彻底的SSL验证关闭配置,同时指定兼容的TLS协议:

USING Progress.Json.ObjectModel.*.
USING OpenEdge.Net.HTTP.*.
USING OpenEdge.Net.HTTP.Lib.*. 
USING OpenEdge.Net.URI.

DEFINE VARIABLE oPayload  AS JsonObject         NO-UNDO. 
DEFINE VARIABLE oURI      AS URI                NO-UNDO. 
DEFINE VARIABLE oRequest  AS IHttpRequest       NO-UNDO.
DEFINE VARIABLE oLib      AS IHttpClientLibrary NO-UNDO.
DEFINE VARIABLE oClient   AS IHttpClient        NO-UNDO.
DEFINE VARIABLE oResponse AS IHttpResponse      NO-UNDO.

oURI = NEW URI( 'https', 'api.exampleurl.com' ).
oURI:Path = '/custom/path'.

oPayload = NEW JsonObject().
oPayload:Add("data","example data").

oRequest = RequestBuilder:POST(oURI, oPayLoad):Request.

// 调整SSL配置:关闭主机验证+指定TLS1.2协议
oLib = ClientLibraryBuilder:Build()
    :sslVerifyHost(NO)
    :sslProtocol('TLSv1.2')
    :LIBRARY. 

oClient = ClientBuilder:Build()
    :UsingLibrary( oLib )
    :Client.

oResponse = oClient:Execute( oRequest ).

注意:此方案存在安全风险,仅建议用于测试环境。

方案3:使用.NET互调用实现SNI支持(生产环境推荐)

OpenEdge 11.7.4支持.NET互操作,可直接调用原生支持SNI的HttpWebRequest类,示例代码:

USING System.Net.*.
USING System.IO.*.
USING System.Text.*.

DEFINE VARIABLE oRequest AS HttpWebRequest NO-UNDO.
DEFINE VARIABLE oStream AS Stream NO-UNDO.
DEFINE VARIABLE oWriter AS StreamWriter NO-UNDO.
DEFINE VARIABLE oResponse AS HttpWebResponse NO-UNDO.
DEFINE VARIABLE oReader AS StreamReader NO-UNDO.
DEFINE VARIABLE cResponse AS CHARACTER NO-UNDO.
DEFINE VARIABLE cJsonPayload AS CHARACTER NO-UNDO.

// 构造JSON请求体
cJsonPayload = '{"data":"example data"}'.

// 创建请求并配置
oRequest = HttpWebRequest:Create("https://api.exampleurl.com/custom/path").
oRequest:Method = "POST".
oRequest:ContentType = "application/json".

// 可选:跳过证书验证(若无需严格验证)
oRequest:ServerCertificateValidationCallback = CLASS System.Net.Security.RemoteCertificateValidationCallback:DynamicInvoke(TRUE, ?, ?, ?, 0).

// 写入请求内容
oStream = oRequest:GetRequestStream().
oWriter = NEW StreamWriter(oStream).
oWriter:Write(cJsonPayload).
oWriter:Close().
oStream:Close().

// 获取并读取响应
oResponse = CAST(oRequest:GetResponse(), HttpWebResponse).
oReader = NEW StreamReader(oResponse:GetResponseStream()).
cResponse = oReader:ReadToEnd().
oReader:Close().
oResponse:Close().

// 输出响应结果
MESSAGE cResponse VIEW-AS ALERT-BOX.

.NET的HttpWebRequest会自动发送SNI标识,可完美适配多子域名的HTTPS请求。

方案4:升级OpenEdge版本(长期解决方案)

若服务器条件允许,将OpenEdge版本升级至12+,即可直接使用ServerNameIndicator参数从根源解决问题,代码与你本地测试的版本一致。

内容的提问来源于stack exchange,提问作者Adrián Magaña

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:53:15