我正在编写一个 PHP 应用程序(充当 SAML IdP),它试图通过对服务器的 SAML 响应进行登录(充当 SAML SP。我目前被服务器拒绝请求(我只得到 500错误的请求)。
我已经编写了一个测试应用程序(在 Java/openSAML 中 - 我很确定服务器正在使用它),并且可以看到问题是 SAML SignatureValidator validate 生成
org.apache.xml.security.signature.XMLSignatureException:DSA 签名的 XMLDSIG 格式无效
查看SAML SignatureValidator 代码,我可以看到它检查 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 格式?