サーバーへのSAMLレスポンスを介してログインを試みているPHPアプリ(SAML IdPとして機能)を作成しています(SAML SPとして機能しています。現在、サーバーがリクエストを拒否することに固執しています(500を取得しただけです)要求の形式が正しくありません)。
テストアプリを(Java/openSAMLで-サーバーが使用していると確信しています)作成しましたが、問題はSAML SignatureValidator検証が生成することであることがわかります
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))
署名の例 (わかりやすくするために 2 進数から 16 進数で表示) は次のとおりです。これは 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 openssl_sign によって生成された 46-48 DER ASN.1 形式から、openSAML によって期待される 40 バイトの P1363 形式への PHP 署名変換を行う方法を知っている人はいますか?