2012-11-13 40 views
6

私は、アサーションの代わりに応答に署名してSAML 2.0を実装しようとしています。私はアサーションレベルで私の署名を受け入れる3つの既存ベンダーを持っていますが、新しいベンダーはプロトコル/応答レベルでそれを要求しています。私は約8時間にわたりグーグルとデバッグを行っており、私が間違っていることの有効な例は見つけられません。下の私のコードは、私がやっていることをはっきりと示しており、最後の10行ほどが私が実装した違い(if/else内)です。また、XMLで、SignatureValueとDigestValueが両方とも空であることに気付きました。誰かが私に明快なドキュメントを教えてもらえますか、それともopenSAMLを使って動作する応答シグネチャの例ですか?この時点で、どんな助けにも感謝しています。openSAMLを使用した署名応答

Assertion assertion = OpenSamlHelper.CreateSamlAssertion(
      issuer.trim(), recipient.trim(), domain.trim(), subject.trim(), 
      attributes);   


    // 
    // Sign 
    // 
    Credential signingCredential = getSigningCredential(keystore, storetype, storepass, alias, keypass); 

    Signature signature = (Signature) Configuration.getBuilderFactory() 
          .getBuilder(Signature.DEFAULT_ELEMENT_NAME) 
          .buildObject(Signature.DEFAULT_ELEMENT_NAME); 

    signature.setSigningCredential(signingCredential); 
    signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);    
    signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); 



      SecurityConfiguration secConfiguration = Configuration.getGlobalSecurityConfiguration(); 
      NamedKeyInfoGeneratorManager namedKeyInfoGeneratorManager = secConfiguration.getKeyInfoGeneratorManager(); 
      KeyInfoGeneratorManager keyInfoGeneratorManager = namedKeyInfoGeneratorManager.getDefaultManager(); 
      KeyInfoGeneratorFactory keyInfoGeneratorFactory = keyInfoGeneratorManager.getFactory(signingCredential); 
      KeyInfoGenerator keyInfoGenerator = keyInfoGeneratorFactory.newInstance(); 
      KeyInfo keyInfo = null; 
      try { 
       keyInfo = keyInfoGenerator.generate(signingCredential); 
      } catch (Exception e) { 
       logger.error(e); 
      } 
      signature.setKeyInfo(keyInfo); 

      String saml = ""; 
      try { 
      MarshallerFactory marshallerFactory = Configuration.getMarshallerFactory(); 
    if (signatureType == SignatureType.Response) { 
     response.setSignature(signature); 
        marshallerFactory.getMarshaller(response).marshall(response); 
    } 
    if (signatureType == SignatureType.Assertion) { 
     assertion.setSignature(signature); 
        marshallerFactory.getMarshaller(assertion).marshall(assertion); 
    } 
     Signer.signObject(signature); 

UPDATE:私は上記のコードで取得したXMLは、以下のように、signatureValueまたはダイジェスト値が含まれていない..

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
<ds:Reference URI="#_651cc837-e890-46c7-9cf9-646ffd38aaad"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/> 
</ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue/> 
</ds:Reference> 
</ds:SignedInfo> 
<ds:SignatureValue/> 

Signer.signObject(署名)を移動させた後、アサーションはレスポンスに取り付けた後のポイントに、私は、次のXMLを受け取る。..

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
<ds:Reference URI="#_273e38e9-3b51-4845-8b8b-f0970e3e9bab"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/> 
</ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue>UlVtsjSAvtjOLMbw+HUX9n7FtxM=</ds:DigestValue> 
</ds:Reference> 
</ds:SignedInfo> 
<ds:SignatureValue> 
jM7GxZ77VBHuAatMXLx14s0ExOmmfDpBhCpF8OKV4F3C1BiRutM41aTH25yhgSn+6l4TkK6kEDbFOYI6isvJUhtdVgH4E1xJl0DFfvPJphTF096acvJrLPehpsFd2Ab6sARuV1sbg/gwNFzvlHJWgit5NxHNuFN1qcv3vuhvQ83fOfxxuyLyJrEjpqvbRzwWepHiuTVHlNObrUvjVxEc7AUKPtwTqGlA6y3SdzIDwjN/LsB1V6PWhiMZsbxJx3LUuk5UECOYmRhKQifZWdOdvHoWBq05J54I6RvAplNDTfRBr4AM+tfIz3OXpN6OpKdSC43HRg9LO9bXprui+4CvrQ== 
</ds:SignatureValue> 
+0

を追加した後、私はこの明日再現しようとするつもりです。あなたはここに何を返そうとしていますか?上記のコードはアサーションの権利に署名しますが、レスポンスには署名しませんか? –

答えて

1

私はちょうどartifactResponseにentityDescriptorを切り替え、署名し、このコードを使用して、アーティファクト応答しようとしましたが、それがうまく働きました。 http://mylifewithjava.blogspot.no/2012/11/signing-with-opensaml.html

<?xml version="1.0" encoding="UTF-8"?><saml2p:ArtifactResponse xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Version="2.0"> 
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
<ds:Reference URI=""> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue>ZkE02ZnvIqyd+FcfL6PaXNI88Co=</ds:DigestValue> 
</ds:Reference> 
</ds:SignedInfo> 
<ds:SignatureValue>fDxfW06rbJEFu5nqmsGxwt6O53N8FWwmDOO0e3nUWh0in2TRYD9nj2927pnQZNL4Mk3KAcSWVETUuHX11XWL+MgcosfJd31TR0XEui/F+BbojQlXJRHfD2BfEO9cQCygFSyyOb9tE2FU5noqnx2b3vI5mToam3a135007mAN/t14Jm71EfvvCF9qL2wXI55R8uab0WGqXx1LYSrAjBZq455SH9AIQu+n8L+KaiOzfpjiL+h/5YJ/a+uyiLV6H06TsytowDTBSW67YW110fpoOsD5vgULrZOABmeK6NRZWpI8PK1M+/r6SO0DTEbUiSTYtHz9XBcqbnD9d7ZQ3oZpEQ==</ds:SignatureValue> 
<ds:KeyInfo> 
<ds:X509Data> 
<ds:X509Certificate>MIIDaTCCAlGgAwIBAgIEeL6vczANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJOTzENMAsGA1UE 
CBMET3NsbzENMAsGA1UEBxMET3NsbzEOMAwGA1UEChMFQ2FwcmExDTALBgNVBAsTBGphdmExGTAX 
BgNVBAMTEFN0ZWZhbiBSYXNtdXNzb24wHhcNMTIxMTA5MTA1MzU0WhcNMTMwMjA3MTA1MzU0WjBl 
MQswCQYDVQQGEwJOTzENMAsGA1UECBMET3NsbzENMAsGA1UEBxMET3NsbzEOMAwGA1UEChMFQ2Fw 
cmExDTALBgNVBAsTBGphdmExGTAXBgNVBAMTEFN0ZWZhbiBSYXNtdXNzb24wggEiMA0GCSqGSIb3 
DQEBAQUAA4IBDwAwggEKAoIBAQCJFImFwnmxM28bSTWOIKCIW1nkZ4euYbB+aLFwc8nJZ0Go5+B3 
sT4gxF5Cr2/syglO9fwNJH+hdIw9qXTcnZL6THGSlb7Hcci/541z3BdaljZ/DFqcvL6BzsY0uBc+ 
3ZbOEr+n3wADZ12GW1Pz7GxjZncJZUwDgO7M/wtscd4jZD7iRnRMux8dVbg8O1ywE16GEM/UkwF3 
Xz98T4/TiEviPLrb+c5IO7KhZyJWndKOucTYUwhi4EZ169XSN03KMZeiMewxqcW4n1fb+GksN/TE 
5Pl0Ci/0gSaAQKYTqAlIZ2TS7oQ0MRnI0jsjsUZDFbznTXBwticfHnoTyHDA4sctAgMBAAGjITAf 
MB0GA1UdDgQWBBQUSNk3I5z4oXsByufaV51IgzuFdTANBgkqhkiG9w0BAQsFAAOCAQEAFmsaXdGS 
fyHjYZzUrZKnX6xjJpB7UA48gd/0/Tylm1zfp+GeRGV3/hQan3+UuV8zrE9lhDUbgnoFFY2Xebrc 
5Ij5DS3pEz8xi+isDCqvHrBGCMQ4G6eRUTxVz4VucY1j8G34+X5KECibyuCGPP1yXZf+57CciSpp 
8tWGBPI1mOuCmEdiucMapJmZa8uQo5FqWZXoJ0cQgZZ1BEgNERAcCZ5xqF03tpfgFuIu7/arp77i 
JKYWPX/a82feabjeecH+gAsWi8Tt1ixKNeNJklFY1GAllxwoDAYcxjjWxIbRh9Bl5Kaaf3S0da3p 
Mkv4S1zTI0Bq/WcR5e0GHUFm4one3g==</ds:X509Certificate> 
</ds:X509Data> 
</ds:KeyInfo> 
</ds:Signature> 
</saml2p:ArtifactResponse> 

キー情報部分をスキップするようにしてください。マーシャリングエラーが発生していませんか?

+0

私はあなたがentityDescriptorで提案したことを試してみるつもりです、私はそれをテストした後に投稿します。そして、いいえ、マーシャリングエラーは発生しません。実際、唯一目立った問題はDigestValueとSignatureValueが空になり、もちろんベンダーが認証できないということです。 – Devon

+2

今朝はコーヒーを飲んだ後、コードを調べて、アサーションを追加する前に応答に署名しようとしていたことに気付きました。これは私の問題でした。そして、いったん私は物事の順序を固定したら、すべてがうまくいったのです。応答してくれてありがとう、あなたのコードは私がしていたことが完全に間違っていなかったことを私に保証しました! – Devon

+0

私は理解していない、アーティファクトを追加する前にartifactResponceに署名しようとしました。それは署名されていない応答を作るべきではありません。それはあなたがそれに署名する必要があります無効な芽です。 –

0

私は同じ問題を抱えていたが、私は

signature.setEntityCertificate(cert); 

そして

KeyInfoGenerator keyInfoGeneratorFactory= keyInfoGeneratorFactory.newInstance(); 
    if (keyInfoGeneratorFactory instanceof X509KeyInfoGeneratorFactory) { 
       ((X509KeyInfoGeneratorFactory) keyInfoGeneratorFactory).setEmitX509Digest(Boolean.TRUE); 
       ((X509KeyInfoGeneratorFactory) keyInfoGeneratorFactory).setEmitX509IssuerSerial(Boolean.FALSE); 
       ((X509KeyInfoGeneratorFactory) keyInfoGeneratorFactory).setEmitEntityCertificate(Boolean.FALSE); 
       ((X509KeyInfoGeneratorFactory) keyInfoGeneratorFactory).setEmitPublicKeyValue(Boolean.FALSE); 
       ((X509KeyInfoGeneratorFactory) keyInfoGeneratorFactory).setX509DigestAlgorithmURI(SignatureConstants.ALGO_ID_DIGEST_SHA1);} 
関連する問題