从DER ASN.1到XMLDSIG P1363的PHP DSA签名转换
我正在编写一个
PHP应用程序(充当SAML IdP),它试图通过SAML响应服务器进行登录(充当SAML SP.我目前停在服务器拒绝请求(我只是得到500)错误的请求).
我已经编写了一个测试应用程序(在Java / openSAML中 – 我很确定服务器正在使用它),并且可以看到问题是SAML SignatureValidator验证生成
查看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字节不等(取决于随机密钥?).
我可以使用PHP openssl_verify成功验证此签名,如下所示. openssl_verify ($canonicalized_signedinfo,$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 openssl_sign生成的46-48 DER ASN.1格式到openSAML期望的40字节P1363格式进行PHP签名转换? 解决方法
resource from code project有关于如何使用代码示例将ASN.1格式转换为P1363的说明.编写Java验证方法可能很有用.
我建议您使用此C代码从PHP生成符合DSIG的签名:http://xmlsig.sourceforge.net/ 顺便说一下,它听起来比简单地生成签名并验证它更复杂.可能感兴趣:XMLBlackbox (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |