PHP openssl_sign() - 来自SoapUi的不同结果

时间:2017-08-02 09:40:34

标签: php xml soapui php-openssl

我必须发送一个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');

其中:

  • $ signedInfo_canonized是" SignedInfo"上的c14N()函数的结果。 xml标签。此标记与SoapUi生成的标记相同。它包含相同的(正确的)DigestValue。
  • $ signature是签名结果。
  • $ 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),它们看起来很相似,但没有一个解决方案适用于我。

有什么想法可以提供帮助吗? ; - )

0 个答案:

没有答案