XADES4j를 사용하여 xml 파일에 서명하려고합니다. 나는 또한 스마트 카드 인증을 사용한다 (창고에서 적재 될 것이다).XADES4j, 인증서 저장소 창 및 스마트 카드 + PIN 코드로 xml에 서명하는 방법
XML 서명 및 스마트 카드가 새로 도입되어 검색 기능을 갖춘 예제가 있습니까? 나는 성공하지 못한 채로 몇 주 동안 고치를 수색했다.
그것에 대해 다른 예제가있다 그러나 그것은 매우 분명하지 않다 :
내가 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);
Luis에게 도움을 주셔서 감사합니다. 서명을 성공적으로 처리했습니다. 그러나 인증서 공급자로부터 xml 파일을 검사 할 때, 그는 나에게이 답변을 보냈다 : "securityController 동안의 오류 : java.lang.String은 java.security.cert.X509Certificate로 캐스팅 될 수 없다". 이 오류의 원인을 알려주시겠습니까? 어떻게 해결할 수 있을까요? 다시 한 번 감사드립니다. –
예외가 꽤 명백한 것 같습니다 .. 그 문제를 일으키는 코드 줄을 찾을 수 있어야 스택 추적 양식을 .. xades4j 문제가있는 것 같지 않지만 그것이 있다면 알려주십시오. – lgoncalves
예, xades4j에서 문제가되지 않는 것 같습니다. 블록을 삭제하고 문제가 해결되었습니다. 나는 여전히 다른 서명 검증 문제 (인증서 공급자 측)를 가지고 있으며 여전히 체크 아웃하고있다. 예 : 서명 블록에 하나의 참조를 유지해야한다. (작성한 참조에는 XPATH2가있다.) 그래서 생성 된 코드를 제거해야한다. 블록에 수집하는 자동 참조 SignedProperties : 일반적으로 문제가 발생하지 않는가? . 곧 차단 오류가 발생하면 귀하의 도움을 기다리고 있습니다! Luis에게 다시 한 번 감사드립니다. –