2014-12-05 3 views
3

"XADES"서명을 확인하는 Java 웹 응용 프로그램을 만들고 싶습니다.이 응용 프로그램은 원본 파일과 분리 된 서명의 두 파일을 가져야합니다.XADES4j를 사용하여 XADES 서명 유효성 확인

저는 훌륭한 프로젝트 인 XADES4j 라이브러리를 사용하고 있습니다. XADES4j를 사용하면 URI 파일에 대한 참조를 확인하지 않고 서명을 확인하는 방법이 있습니까? XML 서명의 지정된 참조 파일에 액세스 할 수 없기 때문입니다.

참조 유효성 확인을 위해 : 주어진 신호 파일에서 계산 된 다이제스트 값과 서명 파일에서 추출한 digestValue를 비교하려고합니다.

여기 여기에 예외

Exception in thread "main" xades4j.XAdES4jXMLSigException: Error verifying the signature 
    at xades4j.verification.XadesVerifierImpl.doCoreVerification(XadesVerifierImpl.java:285) 
    at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:188) 
    at com.wct.VerifyXades.main(VerifyXades.java:33) 
Caused by: org.apache.xml.security.signature.MissingResourceFailureException: The Reference for URI file:/D:/workspace/xades4j-487d7a9bb9e5/data_to_sign/test.txt has no XMLSignatureInput 
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable) 
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable) 
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable) 
Original Exception was org.apache.xml.security.utils.resolver.ResourceResolverException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable) 
Original Exception was java.io.FileNotFoundException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable) 
    at org.apache.xml.security.signature.Manifest.verifyReferences(Manifest.java:412) 
    at org.apache.xml.security.signature.SignedInfo.verify(SignedInfo.java:256) 
    at org.apache.xml.security.signature.XMLSignature.checkSignatureValue(XMLSignature.java:764) 
    at org.apache.xml.security.signature.XMLSignature.checkSignatureValue(XMLSignature.java:696) 
    at xades4j.verification.XadesVerifierImpl.doCoreVerification(XadesVerifierImpl.java:278) 
    ... 2 more 

입니다 난에 XAdES 서명을 확인하기 위해 사용하고있는 소스 코드 :

package com.wct; 

import java.io.FileInputStream; 
import java.security.cert.X509CertSelector; 
import java.security.cert.X509Certificate; 
import java.util.Collection; 
import java.util.Date; 
import java.util.List; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import xades4j.providers.CertificateValidationException; 
import xades4j.providers.CertificateValidationProvider; 
import xades4j.providers.ValidationData; 
import xades4j.verification.UnexpectedJCAException; 
import xades4j.verification.XAdESVerificationResult; 
import xades4j.verification.XadesVerificationProfile; 
import xades4j.verification.XadesVerifier; 

public class VerifyXades { 

    public static void main(String[] args) throws Exception { 
     CertificateValidationProvider certValidator = new CertificateValidationProviderImpl(); 
     XadesVerificationProfile p = new XadesVerificationProfile(certValidator); 
     p.acceptUnknownProperties(true); 
     XadesVerifier v = p.newVerifier(); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(new FileInputStream("data_signed/detachedTestSignature.xml")); 
     XAdESVerificationResult vr = v.verify(doc.getDocumentElement(), null); 
    } 
} 

class CertificateValidationProviderImpl implements CertificateValidationProvider { 
    @Override 
    public ValidationData validate(X509CertSelector certSelector, 
      Date validationDate, Collection<X509Certificate> otherCerts) 
      throws CertificateValidationException, UnexpectedJCAException { 
     return new ValidationData((List<X509Certificate>) otherCerts); 
    } 
} 

내가 서명에 새로운 오전/개발을 확인하고 난 안 좋은 경험이 있습니다. 당신은 당신은 무엇이든지의 다이제스트 비교를 수행해서는 안

답변

2

을하는 데 도움이 사전에

감사 도와주세요. 파일을 어떻게 든 액세스 할 수 있어야 참조가 서명 확인의 일부로 검사 될 수 있습니다.

서명 생성을 제어합니까? 그렇다면 상대 URI에 대한 URI를 변경하거나 익명 참조 (아래 추가 정보)를 사용해야합니다. 어쨌든 모든 옵션은 SignatureSpecificVerificationOptions을 기준으로합니다.

당신이 서명 확인 변경할 수있는 경우 :

  • 는 참조에 상대 파일 URI를 사용하여 모두 서명 productionverification에 기본 URI를 지정합니다. xades4j 테스트에 대한 예제가 있습니다.
  • 익명 참조 (URI 특성 없음)를 사용하고 서명 생성시 AnonymousDataObjectReference을 사용하고 verification에 해당 입력을 사용하여 데이터를 지정합니다.

당신이 서명 생산을 변경할 수없는 경우 :

파일 URI를 처리하고 거기에서 파일 데이터를 반환
+0

우리는 서명 생성을 변경할 수 없습니다. 실제로 우리 프로그램은 분리 된 서명과 원본 파일을 가져와야합니다. "ResourceResolver"를 사용하려고하지만 불행히도 "XadesVerifier"는 항상 분리 된 서명에서 파일의 URI를 확인합니다. ResourceResolver resolver = ResourceResolver.getInstance (doc.createAttribute ("URI"), "file :/D : /workspace/xades4j-487d7a9bb9e5/data_to_sign/test11.txt", false)를 인스턴스화하는 데 사용 된 소스 코드입니다.); options.useResourceResolver (resolver); ' – Khalilos

+0

코드를 이해할 수 없습니다. 기존의 결정자를 얻으려고합니다. 실제 URI를 무시하는 논리를 가진 사용자 지정 해결 프로그램을 사용하도록 제안했습니다.실제로 ResourceResolverSpi를 구현하여 ResourceResolver에 전달해야합니다. ResolverLocalFilesystem의 구현을 살펴볼 수 있습니다. – lgoncalves