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

从DER ASN.1到XMLDSIG P1363的PHP DSA签名转换,php,openssl,saml,der,xml-dsig,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格式无效 查看,我可以看

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

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

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

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

签名由PHP openssl_签名生成,如下所示

openssl_sign($canonicalized_signedinfo,
                  $signature,
                  $private_key,
                  OPENSSL_ALGO_DSS1))
openssl_verify ($canonicalized_signedinfo, 
                 $signature , 
                 $public_key,
                 OPENSSL_ALGO_DSS1))
下面是一个签名示例(为了清晰起见,显示为二进制到十六进制)。这是46个字节,但我注意到它在46到48个字节之间变化(取决于随机键?)

302C02146E74AFEDDB0FAFA646757D73B43BCA688A12FFC521473DC0CA572352C922B80ABD0662965E7B866416D

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

openssl_sign($canonicalized_signedinfo,
                  $signature,
                  $private_key,
                  OPENSSL_ALGO_DSS1))
openssl_verify ($canonicalized_signedinfo, 
                 $signature , 
                 $public_key,
                 OPENSSL_ALGO_DSS1))
但在我的测试应用程序中,当我执行SignatureValidator验证(如下所示)时,我得到了
XMLSignatureException:DSA签名的无效XMLDSIG格式
异常

  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格式吗?

其中解释了如何将ASN.1格式转换为P1363,并提供了代码示例。编写Java验证方法可能会很有用

和我建议您使用这个C++代码从PHP生成一个符合DSIG的签名:

顺便说一下,这听起来比简单地生成签名并验证它更复杂