4

の署名を確認します。ここではhttps://www.w3.org/TR/xmldsig-core/#sec-PKCS1私はSAML応答の署名を検証するために、以下の仕様に従うことをしようとしているSAMLレスポンス

は私のワークフローです:私は、SAMLレスポンスを取得します。私は署名の封筒を取り除き、私はそれを正式化し、私はダイジェストをチェックし、次に署名をチェックする。変換されたSAMLレスポンスのSHA1ダイジェストを正常に計算して検証できました。しかし、RSA-SHA1の署名チェックはまだ私を逃す。

public static boolean verifySignature(String signatureType, PublicKey publicKey, byte[] contentBytes, byte[] sigBytes) { 
    try { 
     Signature sig = Signature.getInstance(signatureType); 
     sig.initVerify(publicKey); 
     sig.update(contentBytes); 
     return sig.verify(sigBytes); 
    } catch (Exception e) { 
     Logger.log(e); 
     return false; 
    } 
} 

私はそれを呼び出すために、このような何かを:

String publicKeyStr = "MIIDNDCCAhwCCQCEk14scLMSGjANBgkqhkiG9w0BAQsFADBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wHhcNMTYwMzAyMTU1NTQ4WhcNMTcwMzAyMTU1NTQ4WjBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwUlZ+qOA61kYh0MGHKTe4JtSL1qJVT/8/i6sWFqbAiGdV33pxSm8iBpqLNPG+fr8aZKugik8mN3y0kZEDwD+EATXGUpqT1v1R6Wr4rRUwsC0wl6d6EiWfdSsu66T11hdrugXF/psjyy4mmvIMMU4RlSaZmT2+gpe57IWPO522Y1HqbuvSvKJgjdyrlhIKLmw7HvZ1ZrQ1j01Hd3/rdK41+zWpSCLuSellHowiDmOzNnyFpTw+SZA0GKE+cm3BOTj/cM36GR2XJd0kIRqj1qqu29cGMlBjQ3cMleG6HoHR9oPNFwYtW1fDTHG6MnxRXYCfZiPeBdX3eBDSuz7GQAv5AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEuQEPhpWdAGg46PSbE20bNt4YH+PjiIzPaXzN5UmpJjyl2kbR18HYXZHEtAXc+ItrYnK+oe+6FhwJ9aiwlrf1/p+U61iyvA9/HWzyW4vflaLWRQ8FxNhAJiVu57IQObjZ13EQfu1O8RK4wzNUVJhOz+pp9toqTHn8wmUPApzqMIl0KpDCPy1TNrwItaiy/gzWQngBMgIcrDeycR8wK2EH6txT8BzI+aqdIc3gBXsn/kS90lelbvYreXqF7VHoMs8fVEPN5fTRjqT9oZb60b1DxcniiTEknZtqprYuMpgEzpOHrzmlbCoNU2yBHuNTQWBz3lG+XtSMtgh16v5Vm48ag="; 
PublicKey publicKey = Security.getPublicKey(publicKeyStr); // uses Certificate class 
String sig = "QfAcRJM2P65JucyBpqn6j48/zd1oSLPBJ0lYI1grH5/xenwBEh0D4Eh0S1J3535OUmldpW7D+G7DW6eAT5N8TdoqUvMXuIAUpFHHDR45KZykPXJPUtli+z2rwlCCHypZWnniT/wrcQYdpp1zzNJBBtKdkaqQg0NMktPSQ/0ti+ruMI3qwfTaL9kDQ3Zyi/a2J3RCAPA0RfviLnDLlid0PthiV1NEbs0AvnguDi57fWXAILk0L1Cx20sliQckxlFQ9u4OaHeMscXdjh3SfESkM9m0Y9PppisZWTrCYzGmvDwsZTCBPD3f/ZFIit+Smgh2fi1u8/gZq0yizPyacR3Y/A=="; 
String newXMLToOperateOn = "<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_420cc1a25a3890bd5df1f4c04bd7e986" ..."; 

boolean sign = Security.verifySignature("SHA1withRSA", pk, newXMLToOperateOn.getBytes(), Util.base64DecodeAsBytes(sig)); 
// SIGN IS FALSE!!!! 

newXMLToOperateOnがある私は署名をチェックするには、このメソッドを持っているhttp://www.w3.org/2000/09/xmldsig#rsa-sha1

SAMLレスポンスは、署名方式のアルゴリズムを含みますSAMLResponseの正しい正規化された文字列XML。これは私が正しいSHA1ダイジェストを生成するために使用するものです。 Security.verify()は、私がOpenID SSOチェックに使用しているので正しく動作します。

また、XML全体ではなくSHA1ダイジェストのバイトをチェックするためにデータを置換しようとしましたが、どちらも機能しませんでした。 E.G. verify(algo, pk, sha1Digest.getBytes(), sig.getBytes()

署名をチェックするときに私がひどく間違っていることがあるかどうか誰かに教えてもらえますか?私は署名を検証していたときに私にトンを助けない

CRYPT (PAD (ASN.1 (OID, DIGEST (data)))) 

:上記のリンク仕様は、署名方法がこれを行うと言われます。自分の例で使用する秘密鍵が見つからないので、署名を再作成できません。

ありがとうございました。

答えて

2

XMLの 'SignedInfo'部分を確認するだけです

+0

それはありがとうTrogdor! – jn1kk

関連する問題