我正在編寫一個PHP應用程序(充當SAML IdP),它試圖通過SAML向服務器做出響應(充當SAML SP。I我目前堅持服務器拒絕請求(我剛剛得到一個500錯誤請求)PHP DSA簽名從DER ASN.1轉換爲XMLDSIG P1363
我已經寫了一個測試應用程序(在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 openssl_sign產生由openSAML預期的40字節P1363格式46-48 DER ASN.1格式的PHP簽名轉換?