2016-08-29 4 views
0

XML이 있고 서명 된 특정 태그가 있습니다. 서명 태그 아래에 참조 uri를 확인할 때 서명 된 XML을 생성 한 후 null을 찾았습니다. Reference URI="". 서명 참조 URI는 서명 된 태그의 ID입니다. 그게 맞습니까?메타 데이터의 서명 참조 URI가 null이됩니다.

Java로 구현 중이며 누군가 제발 나를 도와주세요. 내가 구현 한

<SignedInfo> 
    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
    <Reference URI=""> //------> here is my problem. 
    <Transforms> 
     <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
     <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
     <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default md saml ds xs xsi"/> 
     </Transform> 
    </Transforms> 
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
    <DigestValue>CN74nRredNo8Qlwu4TbW4YLbMEQ=</DigestValue> 
    </Reference> 
</SignedInfo> 

코드 :

File fIDPMetaDataFile = new File(metadata_destination_path); 

     System.out.println("Startin to generate Metadata Information.."); 
     String fn = keyfile_path; 
     String pass = password; 
     Certificate cc = null; 
     X509Certificate certificate1 = null; 
     Key key = null; 

     KeyStore ks = KeyStore.getInstance("pkcs12", "SunJSSE"); 
     ks.load(new FileInputStream(fn), pass.toCharArray()); 

     String alias = ks.aliases().nextElement(); 
     System.out.println("Alias name........................................" + alias); 
     key = ks.getKey(alias, pass.toCharArray()); 
     cc = ks.getCertificate(alias); 

     certificate1 = (X509Certificate) cc; 
     XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory(); 

     EntityDescriptor idpEntityDescriptor = ((SAMLObjectBuilder<EntityDescriptor>) builderFactory.getBuilder(EntityDescriptor.DEFAULT_ELEMENT_NAME)).buildObject(); 

     idpEntityDescriptor.setEntityID(entity_id); 


     AttributeAuthorityDescriptorBuilder aadBuilder = new AttributeAuthorityDescriptorBuilder(); 
     AttributeAuthorityDescriptor aad = aadBuilder.buildObject(); 
     idpEntityDescriptor.getRoleDescriptors().add(aad); 


     //====================Adding IDPSSODescriptor Information================================== 
     IDPSSODescriptor idpSSODescriptor = ((SAMLObjectBuilder<IDPSSODescriptor>) builderFactory.getBuilder(IDPSSODescriptor.DEFAULT_ELEMENT_NAME)).buildObject(); 
     idpSSODescriptor.setWantAuthnRequestsSigned(true); 
     idpSSODescriptor.setID(new IDService().generateID()); 
     //idpSSODescriptor.getSupportedProtocols().clear(); 
     idpSSODescriptor.addSupportedProtocol(SAMLConstants.SAML20P_NS); 

     //====================Adding KeyInfo Information================================== 
     KeyDescriptor encKeyDescriptor = ((SAMLObjectBuilder<KeyDescriptor>) builderFactory.getBuilder(KeyDescriptor.DEFAULT_ELEMENT_NAME)).buildObject(); 
     KeyInfoBuilder keyInfoBuilder = (KeyInfoBuilder) builderFactory.getBuilder(KeyInfo.DEFAULT_ELEMENT_NAME); 
     KeyInfo keyinfo = (KeyInfo) keyInfoBuilder.buildObject(KeyInfo.DEFAULT_ELEMENT_NAME); 
     KeyInfoHelper.addCertificate(keyinfo, certificate1); 

     try { 
      //encKeyDescriptor.setKeyInfo(keyInfoGenerator.generate(signingCredential)); 
      encKeyDescriptor.setKeyInfo(keyinfo); 
     } catch (Exception e) { 
      System.out.println("Error #############" + e.getMessage()); 
     } 
     idpSSODescriptor.getKeyDescriptors().add(encKeyDescriptor); 


     //====================Adding Artifact Resolution Service Information========================== 
     ArtifactResolutionService artifactResService = ((SAMLObjectBuilder<ArtifactResolutionService>) builderFactory.getBuilder(ArtifactResolutionService.DEFAULT_ELEMENT_NAME)).buildObject(); 
     artifactResService.setBinding(SAMLConstants.SAML2_POST_BINDING_URI); 
     artifactResService.setLocation(artifact_resolution_service_location); 
     artifactResService.setIndex(1); 
     artifactResService.setIsDefault(true); 
     idpSSODescriptor.getArtifactResolutionServices().add(artifactResService); 

     //====================Adding NameIDFormat Information========================== 
     NameIDFormat nameIDFormat = ((SAMLObjectBuilder<NameIDFormat>) builderFactory.getBuilder(NameIDFormat.DEFAULT_ELEMENT_NAME)).buildObject(); 
     nameIDFormat.setFormat(NameIDType.TRANSIENT); 
     idpSSODescriptor.getNameIDFormats().add(nameIDFormat); 

     //====================Adding SSO Service Information========================== 
     SingleSignOnService ssoService = ((SAMLObjectBuilder<SingleSignOnService>) builderFactory.getBuilder(SingleSignOnService.DEFAULT_ELEMENT_NAME)).buildObject(); 
     ssoService.setBinding(SAMLConstants.SAML2_POST_BINDING_URI); 
     //assertionConsumerService.setLocation(assertionConsumerServiceURL); 
     ssoService.setLocation(sso_location); 
     idpSSODescriptor.getSingleSignOnServices().add(ssoService); 

     //====================Adding SLO Service Information========================== 
     SingleLogoutService sloService = ((SAMLObjectBuilder<SingleLogoutService>) builderFactory.getBuilder(SingleLogoutService.DEFAULT_ELEMENT_NAME)).buildObject(); 
     sloService.setBinding(SAMLConstants.SAML2_POST_BINDING_URI); 
     //assertionConsumerService.setLocation(assertionConsumerServiceURL); 
     sloService.setLocation(slo_location); 
     idpSSODescriptor.getSingleLogoutServices().add(sloService); 

     //====================Adding Attribute Information========================== 
     Attribute attribute = ((SAMLObjectBuilder<Attribute>) builderFactory.getBuilder(Attribute.DEFAULT_ELEMENT_NAME)).buildObject(); 
     attribute.setName(attribute_username); 
     //attribute.setNameFormat("urn:oasis:names:tc:SAML:2.0:assertion"); 
     idpSSODescriptor.getAttributes().add(attribute); 

     idpEntityDescriptor.getRoleDescriptors().add(idpSSODescriptor); 
     //idpEntityDescriptor.getAttributeAuthorityDescriptor(new IDService().generateID()); 

     //====================Adding Organization Information========================== 
     Organization organization = ((SAMLObjectBuilder<Organization>) builderFactory.getBuilder(Organization.DEFAULT_ELEMENT_NAME)).buildObject(); 
     OrganizationName name = ((SAMLObjectBuilder<OrganizationName>) builderFactory.getBuilder(OrganizationName.DEFAULT_ELEMENT_NAME)).buildObject(); 
     OrganizationDisplayName displayName = ((SAMLObjectBuilder<OrganizationDisplayName>) builderFactory.getBuilder(OrganizationDisplayName.DEFAULT_ELEMENT_NAME)).buildObject(); 
     OrganizationURL orgURL = ((SAMLObjectBuilder<OrganizationURL>) builderFactory.getBuilder(OrganizationURL.DEFAULT_ELEMENT_NAME)).buildObject(); 

     LocalizedString orgName = new LocalizedString(organization_name, ""); 
     name.setName(orgName); 
     organization.getOrganizationNames().add(name); 

     LocalizedString orgDisplayName = new LocalizedString(organization_display_name, ""); 
     displayName.setName(orgDisplayName); 
     organization.getDisplayNames().add(displayName); 

     LocalizedString LocalOrgURL = new LocalizedString(organization_url, ""); 
     orgURL.setURL(LocalOrgURL); 
     organization.getURLs().add(orgURL); 

     idpEntityDescriptor.setOrganization(organization); 

     //====================Adding ContactPerson Information========================== 
     ContactPerson contactPerson = ((SAMLObjectBuilder<ContactPerson>) builderFactory.getBuilder(ContactPerson.DEFAULT_ELEMENT_NAME)).buildObject(); 

     GivenName givenName = ((SAMLObjectBuilder<GivenName>) builderFactory.getBuilder(GivenName.DEFAULT_ELEMENT_NAME)).buildObject(); 
     givenName.setName(given_name); 
     contactPerson.setGivenName(givenName); 

     SurName surName = ((SAMLObjectBuilder<SurName>) builderFactory.getBuilder(SurName.DEFAULT_ELEMENT_NAME)).buildObject(); 
     surName.setName(surname); 
     contactPerson.setSurName(surName); 

     EmailAddress emailAddress = ((SAMLObjectBuilder<EmailAddress>) builderFactory.getBuilder(EmailAddress.DEFAULT_ELEMENT_NAME)).buildObject(); 
     emailAddress.setAddress(email_address); 
     contactPerson.getEmailAddresses().add(emailAddress); 

     idpEntityDescriptor.getContactPersons().add(contactPerson); 

     //====================Write Metadata.xml to file=============================== 
     Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
     Marshaller out = Configuration.getMarshallerFactory().getMarshaller(idpEntityDescriptor); 
     out.marshall(idpEntityDescriptor, document); 

     /* 
     //====================Trasnsform the xml data=============================== 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     StringWriter stringWriter = new StringWriter(); 
     StreamResult streamResult = new StreamResult(stringWriter); 
     DOMSource source = new DOMSource(document); 
     transformer.transform(source, streamResult); 
     stringWriter.close(); 
     */ 

     //final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile); 
    Init.init(); 
    ElementProxy.setDefaultPrefix(Constants.SignatureSpecNS, ""); 
    //final KeyStore keyStore = loadKeyStore(privateKeyFile); 
    final XMLSignature sig = new XMLSignature(document, null, XMLSignature.ALGO_ID_SIGNATURE_RSA); 
    final Transforms transforms = new Transforms(document); 
    transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE); 
    sig.addDocument("", transforms, Constants.ALGO_ID_DIGEST_SHA1); 
    final Key privateKey = key;//keyStore.getKey(PRIVATE_KEY_ALIAS, PRIVATE_KEY_PASS.toCharArray()); 
    final X509Certificate cert = certificate1; 


    sig.addKeyInfo(cert); 

    //sig.addKeyInfo(cert.getPublicKey()); 
    sig.sign(privateKey); 
    document.getDocumentElement().appendChild(sig.getElement()); 

    /* 
    final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    outputStream.write(Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS).canonicalizeSubtree(document)); 
    return outputStream; 
    */ 


     FileOutputStream outFile = new FileOutputStream(fIDPMetaDataFile); 
     XMLUtils.outputDOMc14nWithComments(document, outFile); 
     outFile.close(); 
     System.out.println("Metadata generated successfully..."); 
+0

코드를 올리시겠습니까? –

+0

안녕하세요 .. 코드를 추가했습니다. –

답변

0

나는 여기가 XML에 SAML 객체 데이터를 쓰고 있어요 그리고 난 그 XML을 서명하고 .. 실수를 발견했습니다. 나는 그것을 업데이트했습니다 .. saml 객체에 서명 한 후 XML 파일에 작성합니다. 그런 다음 URI가 설정됩니다.