【发布时间】:2014-07-10 10:35:26
【问题描述】:
业务流程
它有两个步骤 1. 认证用户并获得二进制证书。 2. 在 header 中使用此证书与其他服务通信。
使用 PHP
问题
我将我的凭据发送到一个返回二进制证书的服务。
然后我使用这个二进制证书,使用 PHP 的 base64_encode() 方法将其编码为 base64。因为我不能在 SOAP 请求中进行二进制内容。
我得到的输出要小得多且证书不同,因此我对其他服务的调用失败,给我一个无效的证书错误。
在步骤 1 中使用 SOAP UI
但是,当我将 SOAP UI 用于上述流程时,它工作得非常好。由于soap ui 还使用base64 编码(我已经发现)。 PFB链接 http://my.safaribooksonline.com/book/-/9781849515665/13dot-miscellaneous-topics/id286798206
我什至尝试从 SOAP UI 复制证书并将其硬编码到我的 PHP 代码中。 由于 SOAP UI 以 base64 编码显示证书
仍然通过 PHP 调用失败,提示“证书无效”。
我对这个问题一无所知。任何帮助将不胜感激。
下面是 SOAP UI 代码
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cus="http://ccc/ddd/zzzzzz/jjj/service/serviceName" xmlns:java="java:ccc.ddd.zzzzzz.zzzzzzzzzzz.ccc.lll.zzzzzz.ctx" xmlns:java1="java:ccc.ddd.zzzzzz.zzzzzzzzzzz.ccc.lll.zzzzzz.tttttt" xmlns:java2="java:ccc.ddd.zzzzzz.zzzzzzzzzzz.ccc.lll.zzzzzz.cMode">
<soapenv:Header xmlns:ca="http://ccc.ddd.zzzzzz.jjjj">
<ca:AID>DataAID</ca:AID>
<wsse:Security soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="XXXXXCertificate" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">Binary cintent in encoded format</wsse:BinarySecurityToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<cus:opName>
<cus:p1>
<!--Optional:-->
<java:ApId>
<!--Optional:-->
<java:Name></java:Name>
</java:ApId>
</cus:p1>
</cus:opName>
</soapenv:Body>
</soapenv:Envelope>
以下是来自 PHP Soap 客户端的请求
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="java:ccc.ddd.zzzzzz.zzzzzzzzzzz.ccc.lll.zzzzzz.ctx" xmlns:ns2="java:ccc.ddd.zzzzzz.zzzzzzzzzzz.ccc.lll.zzzzzz.tttttt" xmlns:ns1="http://ccc/ddd/zzzzzz/jjj/service/serviceName" xmlns:ns4="java:ccc.ddd.zzzzzz.zzzzzzzzzzz.ccc.lll.zzzzzz.cMode"" xmlns:ns5="http://ccc.ddd.zzzzzz.jjjj" xmlns:ns6="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SOAP-ENV:Header>
<ns5:CallerID>SE_SYS_1</ns5:CallerID>
<ns5:CallID>1556549759</ns5:CallID>
<ns5:ApplicationID>TEST_APP</ns5:ApplicationID>
<ns5:CustomerID>LH</ns5:CustomerID>
<ns6:Security>
<BinarySecurityToken>Copy pasted from soap ui in same encoding</BinarySecurityToken>
</ns6:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns3:sortCustomerList>
<ns3:p1>
<ns1:ApplicationId>
<ns1:Name/>
</ns1:ApplicationId>
</ns3:p1>
</ns3:sortCustomerList>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
通过 PHP 发送请求时,我没有使用 BinarySecurityToken 标记中的 EncodingType 和 valueType 等。
【问题讨论】:
标签: php web-services soap