PHP SOAP发送二进制安全令牌
商业流 它有两个步骤 1.对用户进行身份验证并获取二进制证书。 2.在标头中使用此证书与其他服务通信 使用PHP 问题 我将凭据发送到一个服务,该服务将返回一个二进制证书 然后我使用这个二进制证书,使用PHP的base64_encode()方法在base64中对其进行编码。因为我不能在SOAP请求中使用二进制内容 我得到的输出要小得多,并且是不同的证书,因此我对其他服务的调用失败,给我一个无效的证书错误 在步骤1中使用SOAPUI 然而,当我为上述流使用soapui时,它工作得非常好。因为soap ui也使用base64编码(我已经发现)。 PFB链路 我甚至尝试从soapui复制证书,并在PHP代码中硬编码它。 正如SOAP UI以base64编码显示证书一样 仍然通过PHP调用失败,表示“证书无效” 我对这个问题一无所知。任何帮助都将不胜感激 下面是soapui代码PHP SOAP发送二进制安全令牌,php,web-services,soap,Php,Web Services,Soap,商业流 它有两个步骤 1.对用户进行身份验证并获取二进制证书。 2.在标头中使用此证书与其他服务通信 使用PHP 问题 我将凭据发送到一个服务,该服务将返回一个二进制证书 然后我使用这个二进制证书,使用PHP的base64_encode()方法在base64中对其进行编码。因为我不能在SOAP请求中使用二进制内容 我得到的输出要小得多,并且是不同的证书,因此我对其他服务的调用失败,给我一个无效的证书错误 在步骤1中使用SOAPUI 然而,当我为上述流使用soapui时,它工作得非常好。因为soa
<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>
数据辅助
编码格式的二进制cintent
下面是来自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无法处理某些Unicode格式,因此其base64\u encode()
函数不会返回有效的base64字符串。
有效的base64编码字符串以=
或=
结尾
因此,您可能必须使用自己的编码器函数,该函数将Unicode转换为UTF-8
PHP用户提交了各种函数。其中一个函数为我做了这个把戏
在获得有效的UTF-8后,使用base64\u encode
函数,您将获得正确的BinarySecurityToken
我使用以下代码将其转换为有效的utf-8格式
function Utf8FromWin($str,$type="w")
{
static $conv='';
if (!is_array($conv))
{
$conv = array();
for($x=128;$x<=143;$x++)
{
$conv['u'][]=chr(208).chr($x); //changed 209 to 208
$conv['w'][]=chr($x+112);
}
for($x=144;$x<=191;$x++)
{
$conv['u'][]=chr(208).chr($x);
$conv['w'][]=chr($x+48);
}
$conv['u'][]=chr(208).chr(129); // Ё
$conv['w'][]=chr(168);
$conv['u'][]=chr(209).chr(145); // ё
$conv['w'][]=chr(184);
$conv['u'][]=chr(208).chr(135); // Ї
$conv['w'][]=chr(175);
$conv['u'][]=chr(208).chr(151); // ї changed 209 to 208
$conv['w'][]=chr(191);
$conv['u'][]=chr(208).chr(134); // І
$conv['w'][]=chr(178);
$conv['u'][]=chr(208).chr(150); // і changed 209 to 208
$conv['w'][]=chr(179);
$conv['u'][]=chr(210).chr(144); // Ґ
$conv['w'][]=chr(165);
$conv['u'][]=chr(210).chr(145); // ґ
$conv['w'][]=chr(180);
$conv['u'][]=chr(208).chr(132); // Є
$conv['w'][]=chr(170);
$conv['u'][]=chr(208).chr(148); // є changed 209 to 208
$conv['w'][]=chr(186);
$conv['u'][]=chr(226).chr(132).chr(150); // №
$conv['w'][]=chr(185);
}
if ($type == 'w') { return str_replace($conv['u'],$conv['w'],$str); }
elseif ($type == 'u') { return str_replace($conv['w'], $conv['u'],$str); }
else { return $str; }
}
函数Utf8FromWin($str,$type=“w”)
{
静态$conv='';
如果(!is_数组($conv))
{
$conv=array();
对于($x=128;$x您可以使用
$certificateContent = file_get_contents($certificateCAcer);
$certificatePemContent = '-----BEGIN CERTIFICATE-----'.PHP_EOL
.chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL)
.'-----END CERTIFICATE-----'.PHP_EOL;
以base64编码结构转换二进制证书