2016-10-25 7 views
0

stackoverflowに関するいくつかの類似の質問がありますが、私は悲しいことに解決策には出ませんでした。私はかなり近いと思うが、正しいステップを欠いている。eid-commonsとitextを使用する - 有効な署名を使ってプログラムで署名する

私は自分のベルギーのEIDカードを使用しています。このカードには署名証明書があり、これを使ってPDFに署名できます。

Mavenのライブラリを使用:

be.fedict.commons-eid - 0.6.5 
com.itextpdf - 5.5.10 
org.bouncycastle - 1.55 

コードを次のようになります。

BeIDCardManager manager = new BeIDCardManager(); 

     manager.addBeIDCardEventListener(new BeIDCardEventsListener() { 

     public void eIDCardInserted(CardTerminal arg0, BeIDCard arg1) { 
      log.info("Inserted"); 
      try { 
       dostuffwithmycard(arg1); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      } 
     } 

...

protected static void dostuffwithmycard(BeIDCard card) throws IOException, DocumentException, GeneralSecurityException { 
     Security.addProvider(new BeIDProvider()); 
     KeyStore keyStore = KeyStore.getInstance("BeID"); 
     keyStore.load(null, null); 
     PrivateKey authnPrivateKey = (PrivateKey) keyStore.getKey("Authentication", null); 
     Signature signature = Signature.getInstance("SHA1withRSA"); 
     signature.initSign(authnPrivateKey); 

     PdfReader reader = new PdfReader("C:\\Untitled.pdf"); 
     FileOutputStream os = new FileOutputStream("C:\\temp\\Signed.pdf"); 
     PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
     PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
     appearance.setReason("Okay"); 
     appearance.setLocation("Home"); 
     appearance.setVisibleSignature(new Rectangle(36,748,144,780), 1, "sig"); 

     ExternalDigest digest = new BouncyCastleDigest(); 
     ExternalSignature sig = new PrivateKeySignature(authnPrivateKey, "SHA1", "BeIDProvider"); 

     MakeSignature.signDetached(appearance, digest, sig, keyStore.getCertificateChain("Signature"), null, null, null, 0, CryptoStandard.CMS); 
    } 

私は基本的に試行錯誤を使用して一緒にこのコードを構築しました。 PINを入力して署名証明書のロックを解除した後で実際にPDFに署名を付けることができるようにしましたが、PDFを開くと署名が無効であることがわかります。私は署名に私の名前を見ることができますが、私は、Adobe Readerでそれを検証しようとすると、私は0x2726

は私が間違ってやっている何かがあるに違いありませんエラーで迎えていますが、私は見つけることができませんでした決定的な理由。

+0

PrivateKey authnPrivateKey = (PrivateKey) keyStore.getKey("Authentication", null);を交換してください、あなたは、サンプル署名付きファイルを共有することはできますか?それは私がitext 5.5.10が別の弾力のある城のバージョンを使用して建てられたと思うかと尋ねられました。バージョンとのマッチングを試みましたか? – mkl

+0

私は、あなたのstackoverflowプロファイルで提供した電子メールアドレスであなたに署名したpdfsを電子メールで送信しようとしました – arnehehe

+0

iTextはBouncyCastle 1.49を使用します。そして、私はすでにbeidとpdfファイルに署名するプロジェクトがあると思う、私はオフィスにいるときにそれを調べるだろう。 –

答えて

1

鍵を取得するにはkeyStore.getKey("Authentication", null)、認証チェーンを取得するにはkeyStore.getCertificateChain("Signature")を使用しています。あなたのカードには2つの証明書があるようです。その後Signature証明書の公開鍵がAuthentication証明書の秘密鍵と一致しません

PrivateKey authnPrivateKey = (PrivateKey) keyStore.getKey("Signature", null); 
+0

それはそれをやった!ありがとうございました。 – arnehehe

関連する問題