XADES4jを使用してxmlファイルに署名しようとしています。私はまた、スマートカード認証(Windowsストアからロードされます)を使用します。XADES4j、証明書ストアウィンドウ、およびスマートカード+ PINコードでxmlに署名する方法
XML署名とスマートカードが新しくなったため、検索に合ったサンプルがありますか?私は成功しなかった数週間の修正を探しました。
はそれについて他の人の例がありますが、それは非常に明確ではありません。
私はhttps://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingDataで、このデモを見つけましたが、私は、Windowsを適用する機能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);
ルイスに感謝します。 私は署名をうまくやり遂げました。しかし、証明書プロバイダからXMLファイルをチェックすると、彼は私にこの答えを送った: "securityController中のエラー:java.lang.Stringはjava.security.cert.X509Certificateにキャストできません"。このエラーの原因を教えてください。どうすれば解決できますか? もう一度ありがとうございます。 –
例外はかなり明白です..スタックトレースを作成すると、その問題の原因となっているコード行を見つけることができるはずです。xades4jの問題ではないようですが、もしあれば教えてください。 – lgoncalves
はい、xades4jでは問題ありません。私はブロックを削除し、問題は解決されました。私はまだ他の署名検証の問題(証明書プロバイダ側)を持っていますが、私はまだそれらをチェックしています。例:署名ブロックに1つの参照を保持する必要があります(作成した参照にはXPATH2が含まれています)ブロックに集まる自動参照SignedProperties:通常それは問題ではありませんか? 。すぐにブロッキングエラーが発生した場合、私はあなたの助けを待っています!もう一度ルイスに感謝します。 –