【问题标题】:PHP DSA Signature Conversion from DER ASN.1 to XMLDSIG P1363从 DER ASN.1 到 XMLDSIG P1363 的 PHP DSA 签名转换
【发布时间】:2012-06-20 17:56:43
【问题描述】:

我正在编写一个 PHP 应用程序(充当 SAML IdP),它试图通过对服务器的 SAML 响应(充当 SAML SP)进行登录。我目前被服务器拒绝请求(我只是得到一个 500 错误请求)。

我已经编写了一个测试应用程序(在 Java/openSAML 中 - 我很确定服务器正在使用它),并且可以看到问题是 SAML SignatureValidator 验证生成

org.apache.xml.security.signature.XMLSignatureException:DSA 签名的 XMLDSIG 格式无效

查看SAML SignatureValidator code,我可以看到它检查 XMLDISG 签名的长度是否正好为 40 字节(P1363 格式?) - 而生成的签名长度为 46-48 字节(DER ASN.1 格式?)。

签名由 PHP openssl_sign 生成,如下所示。

openssl_sign($canonicalized_signedinfo,
                  $signature,
                  $private_key,
                  OPENSSL_ALGO_DSS1))

一个示例签名(为清楚起见显示为二进制到十六进制)如下。这是 46 字节,但我注意到它从 46 字节到 48 字节不等(取决于随机密钥?)。

302c02146e74afeddb0fafa646757d73b43bca688a12ffc5021473dc0ca572352c922b80abd0662965e7b866416d

我可以使用 PHP openssl_verify 成功验证此签名,如下所示。

openssl_verify ($canonicalized_signedinfo, 
                 $signature , 
                 $public_key,
                 OPENSSL_ALGO_DSS1))

但是在我的测试应用程序中,当我执行 SignatureValidator 验证(如下所示)时,我得到了 XMLSignatureException: Invalid XMLDSIG format of DSA signature 异常。

  BasicCredential credential = new BasicCredential();
  credential.setPublicKey(publicKey);
  credential.setUsageType(UsageType.SIGNING);
  SignatureValidator sigValidator = new SignatureValidator(credential);
  sigValidator.validate(signature);

有谁知道如何将 PHP 签名从 PHP openssl_sign 生成的 46-48 DER ASN.1 格式转换为 openSAML 预期的 40 字节 P1363 格式?

【问题讨论】:

    标签: php openssl saml der xml-dsig


    【解决方案1】:

    resource from code project 有关于如何通过代码示例将 ASN.1 格式转换为 P1363 的说明。编写一个 Java 验证方法可能很有用。

    我建议您使用此 C++ 代码从 PHP 生成符合 DSIG 的签名:http://xmlsig.sourceforge.net/

    顺便说一句,这听起来比简单地生成签名并验证它更复杂。你可能对XMLBlackbox感兴趣

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2022-11-04
      • 2017-08-20
      • 2011-07-20
      相关资源
      最近更新 更多