从DER ASN.1到XMLDSIG P1363的PHP DSA签名转换

时间:2012-06-18 17:55:11

标签: php openssl saml der xml-dsig

我正在编写一个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格式?

1 个答案:

答案 0 :(得分:4)

resource from code project解释了如何使用代码示例将ASN.1格式转换为P1363。编写Java验证方法可能很有用。

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

顺便说一下,它听起来比简单地生成签名并验证它更复杂。您可能对XMLBlackbox

感兴趣