首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP SOAP发送二进制安全令牌

PHP SOAP发送二进制安全令牌
EN

Stack Overflow用户
提问于 2014-07-10 10:35:26
回答 2查看 2.4K关注 0票数 1

Buissness流

它有两个步骤1.对用户进行身份验证并获得二进制证书。2.在标头中使用此证书与其他服务进行通信。

使用PHP

问题

我将我的凭据发送到一个服务,该服务返回一个二进制证书。

然后,我使用这个二进制证书,使用PHP的base64 ()方法将其编码到base64_encode中。因为我不能在SOAP请求中添加二进制内容。

我得到的输出要小得多,而且不同的证书,因此我对其他服务的调用失败,给出了一个无效的证书错误。

在步骤1中使用SOAP

但是,当我对上面的流使用SOAP时,它工作得非常好。因为soap也使用base64编码(我已经发现了)。PFB链路http://my.safaribooksonline.com/book/-/9781849515665/13dot-miscellaneous-topics/id286798206

我甚至尝试从SOAP复制证书,并将其硬编码到PHP代码中。正如SOAP以base64编码显示证书一样

仍然通过PHP调用失败,说“证书无效”。

我对这个问题一无所知。任何帮助都将不胜感激。

下面是SOAP代码

代码语言:javascript
复制
    <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客户端的请求

代码语言:javascript
复制
    <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发送请求时,我不使用EncodingType、ans、valueType等在BinarySecurityToken标记中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-05 06:40:32

我已经找到了解决办法。由于PHP无法处理某些Unicode格式,因此它的base64_encode()函数不返回有效的base64字符串。有效的base64编码字符串以===结尾。

因此,您可能必须使用您自己的编码器函数,它将将Unicode转换为UTF-8 PHP,用户提交了各种函数。此页的一个函数帮我完成了这个任务。

在得到有效的UTF-8后,使用base64_encode函数,您将得到正确的BinarySecurityToken。

我使用以下代码将其转换为有效的utf-8格式。

代码语言:javascript
复制
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; }
}
票数 0
EN

Stack Overflow用户

发布于 2017-11-29 11:50:12

您可以使用

代码语言:javascript
复制
$certificateContent = file_get_contents($certificateCAcer);
$certificatePemContent =  '-----BEGIN CERTIFICATE-----'.PHP_EOL
    .chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL)
    .'-----END CERTIFICATE-----'.PHP_EOL;

若要以base64编码结构转换二进制证书,请执行以下操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24674347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档