我必须发送一个soap请求,该部分应使用证书和算法= http://www.w3.org/2000/09/xmldsig#rsa-sha1进行签名。我必须用PHP生成它。
如果我的最终传出请求是正确的,我使用SoapUi应用程序来验证。配置SoapUi(具有相同的证书)后,我有一个请求,外部(接收者)系统接受该请求。所以我可以在SoapUi中查看最终传出的xml是怎样的。
因为在PHP中没有精细的工作实现,这将允许成功签署 传出消息的一部分,所以我准备了自己的一段代码。我已经扩展了php SoapClient,现在我有几乎相同的传出xml,就像在SoapUi中一样。与SoapUi生成的xml相比,我的消息仅在一个字段中有所不同:" SignatureValue"。 xml的其余部分是相同的。
" SignatureValue"字段包含base64_encode($ signature)。 $ signature由以下php代码计算:
openssl_sign($signedInfo_canonized, $signature, $private_key_id, 'sha1WithRSAEncryption');
其中:
$ private_key_id is =
$ private_key_id = openssl_pkey_get_private(' file://' .constant(' PRIVATE_KEY_PATH'),常量(' PRIVATE_KEY_PASSWORD'));
此外,php中的签名验证返回true:
openssl_verify($signedInfo_canonized, $signature, $public_key_id);
所以一切正常,没有错误,但我的" SignatureValue"标签,如上所述,包含" HyaVsqoML0 ...
" base64字符串,但应包含" YsSMvMYfm75 ...
"。
我尝试了几种不同的标准化方法" SignedInfo"节点和每次收到不同的签名,但每次都在SoapUi中不同。
我也无法调试SoapUi来查看内部并检查,上面的过程中的各个部分如何在Java中发布。
我发现了一些关于同一问题的文章和问题(例如这一个:Problems with signature --- openssl_sign),它们看起来很相似,但没有一个解决方案适用于我。
有什么想法可以提供帮助吗? ; - )