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
相关产品推荐
相关产品推荐

