2017-10-17 8 views
0

XADES4j를 사용하여 xml 파일에 서명하려고합니다. 나는 또한 스마트 카드 인증을 사용한다 (창고에서 적재 될 것이다).XADES4j, 인증서 저장소 창 및 스마트 카드 + PIN 코드로 xml에 서명하는 방법

XML 서명 및 스마트 카드가 새로 도입되어 검색 기능을 갖춘 예제가 있습니까? 나는 성공하지 못한 채로 몇 주 동안 고치를 수색했다.

그것에 대해 다른 예제가있다 그러나 그것은 매우 분명하지 않다 :

Example1 Example2

내가 https://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingData에서이 데모를 찾았지만, 나는 윈도우를 적용하는 기능 PKCS11KeyStoreKeyingDataProvider을 설정하는 방법을 모른다 인증서 매개 변수와 핀 코드 :

KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
       "path/to/native/lib", 
       "MS SABRI", // CERTIFICATE NAME 
       new FirstCertificateSelector(), 
       null, 
       null,false);, 

내 코드 :

  try { 

    // >>> TEST N°1 
    // KeyingDataProvider kp = new DirectKeyingDataProvider((X509Certificate) certExemple, PrivateKEY); 

     // >>> TEST N°2 
     KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
       "path/to/native/lib", 
       "name", // CERTIFICATE NAME 
       new FirstCertificateSelector(), 
       new DirectPasswordProvider("123456"), // PIN CODE 
       new DirectPasswordProvider("123456"), // PIN CODE 
       false); 



     // XADES 
     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(); 


     // XML FILE TO BE SIGNED 
     Document doc1 = builder.parse(new File("FileNotSigned.xml")); 

     // NODE 
     Node parentElement   = doc1.getDocumentElement(); 
     Node nodeToSign    = doc1.getDocumentElement().getFirstChild(); 
     Node nodeToAttachSignature = doc1.getDocumentElement(); 


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

     // XPATH STRING 
     String xpathHeader ="/InvoiceHeader"; 
     String xpathBody  ="/InvoiceBody"; 

     // OBJECT 
     DataObjectDesc obj1 = new DataObjectReference(""); 
     obj1.withTransform(XPath2Filter.intersect(xpathHeader).intersect(xpathBody)); 
     SignedDataObjects dataObjs = new SignedDataObjects(obj1); 

     // SIGN 
     signer.sign(dataObjs, nodeToAttachSignature); 

     // TRANSFORMER 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 

     // XML SIGNED 
     Result output = new StreamResult(new File("FileSigned.xml")); 
     Source input = new DOMSource(doc1); 
     transformer.transform(input, output); 

답변

0

"Windows store + smart card"가 의미하는 바가 모두 독점적 인 것으로 확신 할 수 없습니다. 어쨌든 스마트 카드를 사용하고 싶다면 거의 OK입니다.

스마트 카드에는 일반적으로 호스트 OS에 설치된 기본 라이브러리가 있습니다. PKCS11KeyStoreKeyingDataProvider의 첫 번째 인수에서 해당 라이브러리의 경로를 전달해야합니다. 두 번째 매개 변수 (name)는 공급자의 인스턴스를 등록하기위한 이름입니다. 스마트 카드는 대개 PIN에 액세스하여 키에 액세스하므로 보통 keyStorePasswordProviderentryPasswordProvider 인수에 null을 제공 할 수 있습니다.

라이브러리 유닛 테스트에서 example using the Portuguese citizen card을 찾을 수 있습니다.

희망이 도움이됩니다.

+0

Luis에게 도움을 주셔서 감사합니다. 서명을 성공적으로 처리했습니다. 그러나 인증서 공급자로부터 xml 파일을 검사 할 때, 그는 나에게이 답변을 보냈다 : "securityController 동안의 오류 : java.lang.String은 java.security.cert.X509Certificate로 캐스팅 될 수 없다". 이 오류의 원인을 알려주시겠습니까? 어떻게 해결할 수 있을까요? 다시 한 번 감사드립니다. –

+0

예외가 꽤 명백한 것 같습니다 .. 그 문제를 일으키는 코드 줄을 찾을 수 있어야 스택 추적 양식을 .. xades4j 문제가있는 것 같지 않지만 그것이 있다면 알려주십시오. – lgoncalves

+0

예, xades4j에서 문제가되지 않는 것 같습니다. 블록을 삭제하고 문제가 해결되었습니다. 나는 여전히 다른 서명 검증 문제 (인증서 공급자 측)를 가지고 있으며 여전히 체크 아웃하고있다. 예 : 서명 블록에 하나의 참조를 유지해야한다. (작성한 참조에는 XPATH2가있다.) 그래서 생성 된 코드를 제거해야한다. 블록에 수집하는 자동 참조 SignedProperties : 일반적으로 문제가 발생하지 않는가? . 곧 차단 오류가 발생하면 귀하의 도움을 기다리고 있습니다! Luis에게 다시 한 번 감사드립니다. –