2017-10-17 8 views
0

XADES4jを使用してxmlファイルに署名しようとしています。私はまた、スマートカード認証(Windowsストアからロードされます)を使用します。XADES4j、証明書ストアウィンドウ、およびスマートカード+ PINコードでxmlに署名する方法

XML署名とスマートカードが新しくなったため、検索に合ったサンプルがありますか?私は成功しなかった数週間の修正を探しました。

はそれについて他の人の例がありますが、それは非常に明確ではありません。

Example1 Example2

私は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); 

答えて

0

"Windowsストア+スマートカード"とは、両方が排他的なように見えるかどうかわかりません。とにかく、あなたがスマートカードを使いたいなら、コードはほぼOKです。

スマートカードには、通常、ホストOSにインストールされているネイティブライブラリがあります。 PKCS11KeyStoreKeyingDataProviderの最初の引数では、そのライブラリへのパスを渡す必要があります。 2番目のパラメータ(name)はプロバイダのインスタンスを登録するための名前です。スマートカードは通常、鍵にアクセスするためにPINを処理するため、keyStorePasswordProviderentryPasswordProvider引数には通常nullを指定できます。

ライブラリユニットテストではexample using the Portuguese citizen cardが見つかります。

これが役に立ちます。

+0

ルイスに感謝します。 私は署名をうまくやり遂げました。しかし、証明書プロバイダからXMLファイルをチェックすると、彼は私にこの答えを送った: "securityController中のエラー:java.lang.Stringはjava.security.cert.X509Certificateにキャストできません"。このエラーの原因を教えてください。どうすれば解決できますか? もう一度ありがとうございます。 –

+0

例外はかなり明白です..スタックトレースを作成すると、その問題の原因となっているコード行を見つけることができるはずです。xades4jの問題ではないようですが、もしあれば教えてください。 – lgoncalves

+0

はい、xades4jでは問題ありません。私はブロックを削除し、問題は解決されました。私はまだ他の署名検証の問題(証明書プロバイダ側)を持っていますが、私はまだそれらをチェックしています。例:署名ブロックに1つの参照を保持する必要があります(作成した参照にはXPATH2が含まれています)ブロックに集まる自動参照SignedProperties:通常それは問題ではありませんか? 。すぐにブロッキングエラーが発生した場合、私はあなたの助けを待っています!もう一度ルイスに感謝します。 –

関連する問題