USB トークン、HSM などに保存されている証明書を使用して PDF ファイルにデジタル署名したいと考えています。JAVA を使用して USB トークンに保存されている秘密鍵を使用するにはどうすればよいですか?
3 に答える
iTextの自己参照に、追加します
- グノーシス
- デジサイナー
- Apache PDFBox (オープンソース)
- Java4Less (オープンソース、PDFBox ベース)
- アドビ ライブサイクル
- jPDFセキュア
- オラクル・フュージョン
PDF ファイルにデジタル署名を追加する手順:
(I) テンプレート PDFDocument の作成:
テンプレート署名を使用して PDFDocument を作成します。
PDSignature pdSignature;
pdSignature.setByteRange(new int[]{0, 0, 0, 0});
pdSignature.setContents(new byte[n*1024]);
ここで、n は整数、つまり kbs の倍数です。
注: コンテンツ サイズは、署名と証明書ファイルの長さの合計以上である必要があります。
(II) テンプレート PDF ドキュメントを更新します。
(a) Update /ByteRange[abcd]:
(i) a= "%PDF" の % のオフセット (=0、デフォルト)
(ii) b= "/Contents<000...000>" の < のオフセット
(iii) c= "/Contents<000...000>" の >
のオフセット (iv) d= "%%EOF" の F のオフセットから上から c を引いたもの
(b) xref セクション
の更新: オブジェクトの位置を指定する相互参照テーブル (xref セクション) を更新し、
(c) startxref セクション
の更新: 相互参照テーブル (xref) の開始のオフセットである startxref を更新します。
(III) 更新テンプレート文書の電子署名生成:
「/Contents<000...000>」の仮署名データ(「000...000」)を除いた更新テンプレート文書の生成
(IV) Update Content<> セクション:
"/Contents<000...000>" の Signed Data の長さの最初/最初の "0" を、テンプレート PDFFile の Signed Data (Enveloped) に置き換えます。
提案:
PDFBox の SignatureInterface を使用します。
(a) SignatureInterface を実装して sign() メソッドを呼び出します (b) 入力、出力ファイル、キーストア、エイリアス、ピンを提供します (c) 増分を保存します
(または) Java pdf ライブラリ (iText など) を使用します。
(または) 手順 I ~ IV を Java で自分で実装します。
USB トークン、スマートカード、またはハードウェア セキュリティ モジュールを使用して PDF にデジタル署名したいようです。これは、 http://itextpdf.com/book/digitalsignaturesで説明されているように、PKCS#11 を介して行われます。ソース コードはここにあります。これは、SafeNet iKey 400 USB トークンを使用して署名する方法を示す例です。