Progress OpenEdge 11.7 HttpClient如何使用P12证书调用WebService?
使用Progress OpenEdge 11.7 HttpClient加载P12证书调用WebService
你之前的错误在于把cURL的命令行参数当成HTTP请求头来设置了——证书相关的配置属于SSL/TLS层的设置,不是HTTP请求头的一部分,所以直接加Header肯定无效。下面是用OpenEdge HttpClient实现该需求的正确方式:
核心思路
通过ClientLibraryBuilder配置SSL上下文,直接加载P12格式的客户端证书,而不是通过请求头传递证书信息。
完整示例代码
DEFINE VARIABLE oLib AS HttpClientLibrary NO-UNDO. DEFINE VARIABLE oHttpClient AS HttpClient NO-UNDO. DEFINE VARIABLE oRequest AS HttpRequest NO-UNDO. DEFINE VARIABLE oResponse AS HttpResponse NO-UNDO. DEFINE VARIABLE lcP12Path AS CHARACTER NO-UNDO. /* P12证书的完整路径 */ DEFINE VARIABLE lcP12Pass AS CHARACTER NO-UNDO. /* P12证书的密码 */ DEFINE VARIABLE lcXmlContent AS CHARACTER NO-UNDO. /* 要上传的XML内容 */ DEFINE VARIABLE lcUrl AS CHARACTER NO-UNDO. /* 目标WebService地址 */ DEFINE VARIABLE lcFiche AS CHARACTER NO-UNDO. /* 你的文件前缀变量 */ /* 1. 配置SSL上下文,加载P12证书 */ oLib = ClientLibraryBuilder:Build() :sslVerifyHost(NO) /* 对应cURL的-k参数,禁用主机名验证 */ :SetClientCertificate(lcP12Path, lcP12Pass, "PKCS12") /* 指定证书路径、密码和格式 */ :LIBRARY. /* 2. 构建配置好SSL的HttpClient */ oHttpClient = ClientBuilder:Build():UsingLibrary(oLib):Client. /* 3. 读取要上传的XML文件内容 */ lcXmlContent = FILE-INFO(lcFiche + ".xml"):FILE-CONTENT. /* 4. 构建POST请求,设置XML内容和Content-Type */ oRequest = RequestBuilder:Post(lcUrl, lcXmlContent) :AddHeader("Content-Type", "application/xml;charset=UTF-8") :Request. /* 5. 执行请求并获取响应 */ oResponse = ResponseBuilder:Build():Response. oHttpClient:Execute(oRequest, oResponse). /* 6. 处理响应:写入文件(对应cURL的-o参数)+ 状态判断 */ IF oResponse:StatusCode = 200 THEN DO: OUTPUT TO VALUE(lcFiche + "out.xml"). PUT UNFORMATTED oResponse:ResponseBody. OUTPUT CLOSE. MESSAGE "请求完成,响应已写入文件" VIEW-AS ALERT-BOX. END. ELSE DO: MESSAGE "请求失败,状态码:" oResponse:StatusCode "错误信息:" oResponse:ReasonPhrase VIEW-AS ALERT-BOX. END. /* 清理资源 */ oHttpClient:Release(). oLib:Release().
关键说明
SetClientCertificate是核心方法:第三个参数指定证书格式为PKCS12(对应P12文件),直接加载完整的P12证书,不需要像cURL那样拆分成pem证书和密钥文件。sslVerifyHost(NO)对应你cURL命令里的-k,如果目标服务器的CA证书是可信的,建议改为YES启用主机名验证,提升安全性。- 读取XML内容时,
FILE-INFO会保留文件原有编码,确保和接口要求的UTF-8一致。
补充:添加CA证书验证(对应cURL的--cacert)
如果目标服务器需要指定CA证书来验证,可在配置SSL上下文时添加:
oLib = ClientLibraryBuilder:Build() :sslVerifyHost(YES) :SetCACertificate(lcpemCacert) /* 传入CA证书文件路径 */ :SetClientCertificate(lcP12Path, lcP12Pass, "PKCS12") :LIBRARY.
内容的提问来源于stack exchange,提问作者Raulitop 128
相关产品推荐
相关产品推荐

