WS-Security,以及如何进行身份验证

时间:2018-01-26 07:50:32

标签: php xml web-services soap ws-security

该服务的文档说我需要使用WS-Security。 从他们的支持,我得到了一个p12文件,我应该使用它。

到目前为止我做了什么
我运行了SoapUI应用程序,配置它,添加了wsdl等,并获得了消息 <faultstring>These policy alternatives can not be satisfied: (...)</faultstring> 所以我发现我需要在请求中添加基本的Auth。我得到了正确的答案。 enter image description here

我现在需要什么
我需要在PHP应用程序上使用它来处理SOAP请求 首先,我将p12文件更改为pem,然后尝试:

$soapClient = new SoapClient('https://int.pz.gov.pl/pz-services/tpSigning?wsdl',
        array('location' => 'https://int.pz.gov.pl/pz-services/tpSigning?wsdl', 
        'trace' => 1,"exceptions" => 1, 
        'local_cert'=>'path/cert_file.pem',
        'passphrase'=>'cert_password'
));

但我仍然收到有关政策不满意的失败消息:

These policy alternatives can not be satisfied: 
{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}AsymmetricBinding: Received Timestamp does not match the requirements 
{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}X509Token: The received token does not match the token inclusion requirement 
{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}SignedParts: Soap Body is not SIGNED in (...)

帮助吗
只用PHP就可以了吗?我尝试了几个解决方案,发现一些类扩展了SoapClient(使用用户/密码,而不是p12 / pem文件),在c#中找到了解决方案(如果我需要这样做,我也准备好使用了 - 用WebSocket将xml发送到c# ,并将其发送回浏览器),但没有那些工作。

1 个答案:

答案 0 :(得分:0)

将证书更改为pem格式是正确的方法。本机PHP soap客户端类无法处理p12证书。你试过以下这个吗?

try {
    $oClient = new SoapClient(
        'https://int.pz.gov.pl/pz-services/tpSigning?wsdl',
        [
            'authentication' => SOAP_AUTHENTICATION_DIGEST,
            'exceptions' => true,
            'local_cert' => dirname(__FILE__) . 'mycert.pem',
            'passphrase' => 'my_passphrase',
            'trace' => true, 
        ]
    );
} catch (SoapFault $oSoapFault) {
    echo "<pre>";
    var_dump($oSoapFault);
    echo "</pre>";
}

PHP soap客户端类默认使用SOAP_AUTHENTICATION_BASIC。也许DIGEST auth是正确的方式?通常,证书包括所有数据。

您不需要位置选项。当使用与目标命名空间的非wsdl对话作为uri选项而没有直接的wsdl文件时,只需要位置选项。

始终牢记:与SoapUI一起使用的东西不应该与本机PHP客户端一起运行。 ;)