2016-11-23 2 views
0

다음 코드는 document.xml에 content.xml을 가져오고 document.xml 루트 요소에 서명하는 코드입니다. 같은 서명 생성Xades4J 서명의 서명 요소에서 namespace를 제거하는 방법은 무엇입니까?

try { 
      KeyingDataProvider kp = new FileSystemKeyStoreKeyingDataProvider(
        "pkcs12", 
        "C:\\workspace\\tests\\my\\LG.pfx", 
        new FirstCertificateSelector(), 
        new DirectPasswordProvider("mykeypass"), 
        new DirectPasswordProvider("mykeypass"), 
        true); 
      XadesSigningProfile p = new XadesBesSigningProfile(kp); 
      XadesSigner signer = p.newSigner(); 

      javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      javax.xml.parsers.DocumentBuilder builder = null; 
      builder = factory.newDocumentBuilder(); 


      Document doc1 = builder.parse(new File("C:\\workspace\\tests\\document.xml")); 
      Document doc2 = builder.parse(new File("C:\\workspace\\tests\\content.xml")); 

      Node contentElement = doc2.getDocumentElement(); 
      Node parentElement = doc1.getDocumentElement(); 
      Node adoptedContentElement = doc1.adoptNode(contentElement); 
      parentElement.appendChild(adoptedContentElement); 

      Node nodeToSign = doc1.getDocumentElement().getFirstChild(); 
      Node nodeToAttachSignature = doc1.getDocumentElement(); 

      IndividualDataObjsTimeStampProperty dataObjsTimeStamp = new IndividualDataObjsTimeStampProperty(); 
      AllDataObjsCommitmentTypeProperty globalCommitment = AllDataObjsCommitmentTypeProperty.proofOfApproval(); 
      CommitmentTypeProperty commitment = CommitmentTypeProperty.proofOfCreation(); 

      DataObjectDesc obj = new EnvelopedXmlObject(nodeToSign, "text/xml", null); 
      SignedDataObjects dataObjs = new SignedDataObjects(obj).withCommitmentType(globalCommitment); 

      signer.sign(dataObjs, nodeToAttachSignature); 

      Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
      Result output = new StreamResult(new File("C:\\workspace\\tests\\signedDocument.xml")); 
      Source input = new DOMSource(doc1); 
      transformer.transform(input, output); 


     } catch (KeyStoreException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (XadesProfileResolutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerFactoryConfigurationError e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (XAdES4jException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-26102a68-cfea-43fd-a40e-9682ae7da4a1"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> 

질문은을 - 어떻게 서명 요소에서 네임 스페이스 ds:를 제거하려면?

답변

1

"네임 스페이스 제거"는 접두사 제거를 의미한다고 생각합니다. 기본 접두사가 set by Apache Santuario이고 creating a XMLSignature 일 때 사용되기 때문에 xades4j를 통해 제어 할 수있는 일이 아닙니다. 기본값은 set on the Init class 인 것 같습니다. 나는 어떻게/설정을 재정의 할 것인지 잘 모르겠다.

1

Java의 Apache Santuario 라이브러리의 경우 CreateSignature이라는 예제에서 접두어 "ds"가 설정되어있는 줄을 보았습니다.

5.2 서명 제작 : 라이브러리의 개발자가 쓴 책에서

ElementProxy.setDefaultPrefix(Constants.SignatureSpecNS, "ds"); 

, 그는 XAdES4j는 서명이 아닌 전체 문서를 구축하는 대부분이기 때문에, 서명을 정의하는 방법을 지정합니다 : 앞에서 논의한 것처럼 서명은 두 부분으로 구성 될 수 있습니다. 첫 번째 부분은 서명자와 서명 작업 자체의 특성으로 구성됩니다. 두 번째, 리소스가 서명되었습니다. 서명자가 정규 서명인 프로듀서로 간주되는 경우 그는 서명이 생성 될 때마다 의 특성 집합, 즉 서명 프로파일을 가질 가능성이 큽니다. 이 특성은 서명간에 고정되어 있으며 서명 된 리소스는 다릅니다. 따라서 서명을 생성하는 것은 프로파일 과 자원 세트를 결합하여 최종 XML 구조를 생성하는 것입니다. 이 프로세스는 다음과 같은 세 가지 주요 작업으로 구성됩니다. 적절한 순서로 필요한 정보 (시그니처 및 데이터 개체 속성, 알고리즘, 키 입력 데이터) 수집. Apache XML 보안 API을 사용하여 핵심 서명 구조를 만듭니다. 서명에 DOM 트리를 추가 할 수 있습니다. Apache XML Security 은 핵심 서명 구조에 대한 DOM 트리를 생성합니다. 그러나 XAdES 요소는 Apache API에서 알 수 없으므로 마지막 작업 인 이 라이브러리에서 완전히 지원되어야합니다.

: XAdES4j - XAdES 서명 서비스 용 Java 라이브러리. DS를 추가 피하기 위해

Constants.setSignatureSpecNSprefix(""); 
1

봅니다 코드에 넣어 서명 XML에

1

가 친절 위의 자바 버전 6.32를 사용하거나 : 루이스 필리페 도스 산토스 곤살 베스에 의해