2012-11-13 37 views
6

Tôi đang cố gắng triển khai SAML 2.0 bằng cách ký trả lời, thay vì Xác nhận. Tôi có 3 nhà cung cấp hiện tại chấp nhận chữ ký của tôi ở cấp độ Xác nhận, tuy nhiên một nhà cung cấp mới đang yêu cầu nó ở cấp độ giao thức/phản hồi. Tôi đã được Googling và gỡ lỗi trong khoảng 8 giờ, và không thể tìm thấy một ví dụ hợp lệ về những gì tôi đang làm sai. Mã của tôi dưới đây cho thấy rõ ràng những gì tôi đang làm, và 10 dòng cuối cùng hoặc hơn của nó là những khác biệt mà tôi đã thực hiện (trong if/else). Ngoài ra, tôi nhận thấy trong XML của tôi rằng SignatureValue và DigestValue của tôi đều trống. Bất cứ ai có thể chỉ cho tôi hướng dẫn một số tài liệu rõ ràng, hoặc tốt hơn, một ví dụ về một chữ ký phản ứng làm việc bằng cách sử dụng openSAML? Tại thời điểm này, bất kỳ trợ giúp được đánh giá cao.Ký trả lời bằng cách sử dụng 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 tôi đã nhận được với đoạn code trên không bao gồm signatureValue hay Digest giá trị, như dưới đây ..

<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/> 

Sau khi di chuyển Signer.signObject (chữ ký); đến một điểm sau khi khẳng định được gắn vào phản ứng, tôi nhận được XML sau ..

<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

Tôi sẽ cố gắng tái tạo ngày mai này. Bạn đang cố gắng phản ứng gì ở đây? Đoạn mã trên ký xác nhận đúng chứ không phải phản hồi? –

Trả lời

1

Tôi cố gắng để ký tên và phản ứng tạo tác sử dụng mã này, chỉ cần chuyển đổi các entityDescriptor một artifactResponse và nó làm việc tốt. 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> 

Cố gắng bỏ qua phần KeyInfo. Bạn không nhận được bất kỳ lỗi marshalling?

+0

Tôi sẽ thử những gì bạn đề xuất với thực thểDescriptor, tôi sẽ đăng lại khi tôi đã thử nghiệm nó. Và không, tôi không nhận được bất kỳ lỗi marshalling, trên thực tế, vấn đề đáng chú ý duy nhất là DigestValue và SignatureValue trở lại trống rỗng, và tất nhiên, các nhà cung cấp không thể xác thực. – Devon

+2

Vì vậy, sau một vài tách cà phê sáng nay, tôi xem xét mã của mình và nhận ra rằng tôi đang cố gắng ký vào phản hồi trước khi thêm Xác nhận vào đó. Đây là vấn đề của tôi, và một khi tôi cố định thứ tự của mọi thứ, mọi thứ đã diễn ra. Cảm ơn bạn rất nhiều vì phản hồi, mã của bạn đã giúp tôi đảm bảo rằng những gì tôi đang làm không hoàn toàn sai! – Devon

+0

tôi không hiểu, bạn đã cố gắng ký artifactResponce trước khi thêm phần tạo tác. Điều đó không làm cho câu trả lời không được ký. Nó sẽ là nụ hợp lệ bạn nên có chữ ký trên đó. –

0

tôi đã cùng một vấn đề, nhưng sau khi tôi thêm

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);} 
Các vấn đề liên quan