该服务的文档说我需要使用WS-Security。 从他们的支持,我得到了一个p12文件,我应该使用它。
到目前为止我做了什么
我运行了SoapUI应用程序,配置它,添加了wsdl等,并获得了消息
<faultstring>These policy alternatives can not be satisfied: (...)</faultstring>
所以我发现我需要在请求中添加基本的Auth。我得到了正确的答案。
我现在需要什么
我需要在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# ,并将其发送回浏览器),但没有那些工作。
答案 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客户端一起运行。 ;)