2012-06-18 50 views
4

我正在編寫一個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簽名轉換?

回答

4

resource from code project說明了如何使用代碼示例將ASN.1格式轉換爲P1363。編寫Java驗證方法可能很有用。

而且我建議你使用這個C++代碼來生成從PHP一個DSIG兼容簽名:http://xmlsig.sourceforge.net/

順便說一句,這聽起來更復雜不是簡單地生成簽名和驗證。您可能會感興趣XMLBlackbox