長期署名PAdESライブラリよくいただくご質問

仕様について

長期署名とは何ですか?

証明書の有効期限を超えて署名を有効(検証可能)にする仕組みです。通常の電子署名では証明書の有効期限後には正しく検証できなくなります。証明書の有効期限は通常数年ですので5~10年以上の保管と有効性を保つ用途には長期署名が必要となります。逆に長期保管が必要無い場合には長期署名では無く通常の電子署名で構いません。

参考資料:有限会社ラング・エッジ社 ブログ シリーズ長期署名1:長期署名入門

長期署名(ISO32000-2/PAdES仕様)と従来の電子署名(ISO32000-1/PDF署名)とは何が異なりますか?

PDFの長期署名(PAdES)仕様はISO32000-2から採用されました。従来のISO32000-1(PDF署名)仕様と比較して以下の3つの要素が追加されました。

  • CAdESを署名データに利用した、PAdES-Enhanced仕様
  • 長期署名用に証明書と検証情報を埋め込む、PAdES-LTVのDSS/VRI仕様
  • タイムスタンプだけを付与できる、PAdES-LTVのDocTimestamp仕様

一方で従来のISO32000-1(PDF署名)仕様は、PAdES-Basic仕様として再整理されました。『長期署名PAdESライブラリ』では機能レベルにより2製品が提供されています。詳しくは「製品概要」をご覧ください。

ISO32000-2のPAdES仕様とETSI(欧州電気通信標準化機構)のPAdES仕様の関係はどうなっていますか?

長期署名の仕様は元々EU(欧州)の標準化組織であるETSIのTC ESI(電子署名基盤技術委員会)にて標準化されました。XMLとCMSの長期署名仕様である、XAdESとCAdESに続いて、PDFの長期署名仕様であるPAdESに関してもETSI TS 102 778として公開されました。PDFの標準仕様であるISO32000-2(現在標準化作業中で2014~2015年に完了予定)は、ETSI TS 102 778のPAdES仕様が反映されています。つまりPAdESの元仕様はETSIのPAdES仕様であり、後からISO32000に反映される関係となります。

PDF/A仕様をサポートしていますか?

『長期署名PAdESライブラリ』は、PDF/Aをサポートしていません。PDF/A準拠のPDFに署名はできますが、署名したPDFファイルはPDF/A準拠となりません。

PDFの暗号化をサポートしていますか?

未暗号化の入力ファイルに対しての暗号化はできませんが、暗号化済みの入力ファイルへの署名は可能です。暗号方式としてパスワードによる暗号化に関してはAcrobat-9までの暗号化仕様に対応しています。証明書(デジタルID)による暗号化には対応しておりません。

証明書/タイムスタンプについて

ICカードやUSBトークンに格納された証明書(秘密鍵)を署名に使うことができますか?

Windows版では、CryptoAPI(CAPI)対応のUSBトークンやICカードであれば署名に利用できます。Linux版では基本的に対応していません。実績や詳しくは「機能紹介:認証局とタイムスタンプ局」をご覧ください。

機能紹介:認証局とタイムスタンプ局

RSA-2048bit・SHA-2の証明書(秘密鍵)に対応していますか?

対応しています。RSAは2048bitと4096bitに、ハッシュ方式は SHA-1とSHA-2(256bit/384bit/512bit)がご利用頂けます。
利用実績のある認証局(証明書発行元)を教えてください。

基本的にはPKCS#12ファイル形式またはWindows版であればCAPI利用のICカード等で証明書を提供している認証局であれば利用が可能です。GPKI等の官職証明書やICカードも利用可能です。実績に関して詳しくは「機能紹介:認証局とタイムスタンプ局」をご覧ください。

機能紹介:認証局とタイムスタンプ局

OpenSSL等を使って自分で生成した証明書と秘密鍵は使えますか?

PKCS#12形式のファイルにすれば利用可能です。Windows版ではPKCS#12以外にWindows証明書ストアにインストール頂いても利用頂けます。

Adobe CDS 証明書に対応していますか?

対応していないので、ご利用頂けません。Adobe CDS(Certified Document Service)証明書はAdobe社認定の認証局でのみ利用が可能であり、サードベンダーには利用が許可されていないためです。

利用実績のある商用タイムスタンプサービス(認定TSA)を教えてください。

国内の主な商用タイムスタンプサービス(アマノタイムスタンプサービス3161やSEIKO認定タイムスタンプサービス等)には標準で対応しています。詳しくは「機能紹介:認証局とタイムスタンプ局」をご覧ください。

機能紹介:認証局とタイムスタンプ局

認証局や電子署名の勉強をするのに良い資料はありませんか?

認証局の業界組織である電子認証局会議にて公開されている「電子署名活用ガイド」がおすすめです。法的な観点からだけでなく事例まで分かりやすくまとまっています。冊子としても配布されていますが、PDFファイルとしてダウンロードも可能です。

電子署名活用ガイド 第2版(2013年9月)電子認証局会議

PFX形式の証明書(秘密鍵)ファイルとは、PKCS#12形式のファイルと同じですか?

同じと考えて頂いて問題ありません。PFX(Personal inFormation eXchange)はPKCS#12の旧称となります。Windows環境では拡張子 .pfx と .p12 のどちらでも構いません。

API/コマンドラインについて

JAVA APIが対応している、JDKのバージョンを教えてください。

『長期署名PAdESライブラリ』は、JDK 1.6(JRE 6.0)以降でお使い頂けます。なおJNIを利用しているので32ビット版と64ビット版は『長期署名PAdESライブラリ』とJAVAのJDK/JREで一致している必要があります。

JAVAのキーストアは利用できますか?

利用できません。『長期署名PAdESライブラリ』のJAVA APIはJNI(Javaからのネイティブ呼び出し)を利用しているので、JAVA環境のキーストアにはアクセスできません。JAVA APIからも利用でも、PKCS#12ファイル形式またはWindows版であればWindows証明書ストアを利用してください。なお JAVA APIのサンプルが、sample/LePAdES/javaの下に用意されていますので評価版を入手してご覧ください。

評価版のお申し込み

Windows版 C++ APIが対応しているVisual Studioのバージョンを教えてください。

標準でVisual Studio 2015とVisual Studio 2019に対応しています。リビルドすることで、VS2010/VS2012/VS2013/VS2017に対応可能です。なお、C++ APIのサンプルは、sample/LePAdES/cppの下に用意されていますので評価版を入手してご覧ください。

評価版のお申し込み

コマンドラインでPKCS#12ファイルを利用して署名する方法を教えてください。

『長期署名PAdESライブラリ』では、コマンドプログラム LpaCmdが提供されています。
ここでは、PKCS#12ファイルを利用した、不可視署名フィールドの作成と署名付与の例を記載します。その他利用方法の詳細はヘルプンド(LpaCmd -help)を参照してください。また、sample/LePAdES/cmdの下にサンプルコードが用意されていますので、評価版を入手してご覧ください。

評価版のお申し込み

$ LpaCmd -sign -newf -cert p12 LeTest.p12 test -in input.pdf -out singed.pdf

コマンドラインで署名済みPDFファイルを検証する方法を教えてください。

以下のコマンドラインにて、検証を行い結果(レポート)を画面に表示することができます。コマンドラインのサンプルが sample/LePAdES/cmd の下に用意されていますので評価版を入手してご覧ください。

$ LpaCmd -verify -report -in singed.pdf

評価版のお申し込み

署名機能について

ICカードやUSBトークンに格納された証明書(秘密鍵)の署名時にPINコードの入力画面が開いてしまいます。APIやコマンドラインの引数にPINコードをセットしてPINコードの入力画面を開かず、一括で署名処理を行うことは可能でしょうか?

できません。PINコードの入力画面はICカードやUSBトークンのドライバが表示していますので、『長期署名PAdESライブラリ』のAPIでは対応できません。

署名外観の印影を透過(スタンプの下の文字や文面が見える状態)にしたいのですが、どのように設定したら良いでしょうか?

印影として画像ファイルを指定した場合には透過にはできません。ただし、Ver.1.06.R1から、透過PNG画像による透過署名外観が追加されました。予め印影の透過PNGをご用意ください。

署名形式で指定する署名データ形式のうち、PKCS#7とCAdESの違いを教えてください。

PKCS#7はCAdESのベースともなった署名データ形式ですので似ていますが、署名証明書を保護する属性等がCAdESでは追加されているので、CAdESの方がよりセキュアな署名データ形式と言えます。今後生成する署名では可能な限りCAdES署名データ(PAdES-Enhanced)の利用をおすすめします。

署名種別で指定する、普通署名とMDP署名の違いを教えてください。

複数の署名を付与していく場合には普通署名を使います。MDP署名時にはその後可能な操作の制限ができるというメリットがあありますが、これは、後から検証情報の埋め込みやドキュメントタイムスタンプを付与する必要がある長期署名(長期保管)には対応できないというデメリットになります。

証明書の署名アルゴリズムに使われているハッシュ方式(例:SHA-256)と、署名時に指定するハッシュ方式は同じである必要がありますか?

証明書の署名と、PDF署名/PAdESの署名は全く別のデータですので両者のハッシュ方式等は異なっていても構いません。SHA-1署名の証明書で、SHA-2署名のPDF署名を付与することも可能ですし、その逆も可能です。

『長期署名PAdESライブラリ』で作成した署名フィールドに、Adobe Acrobat/Readerで電子署名を付ける事はできますか?

Adobe Acrobatであれば電子署名を付けることができますが、Adobe Readerでは電子署名を付けることはできません。Adobe Readerで電子署名を付けるには、サードベンダーには許可されていない方法(つまりAdobe製品でのみ可能な方法)で署名フィールドを生成しておく必要があります。

検証機能について

Adobe Acrobat/Readerと検証結果は一致しますか?

ほぼ一致しますが、相互の設定や対応状況の違いにより一致しないケースもあります。
例えばX.500とディレクトリサーバによる検証が必要な証明書(GPKIの官職証明書等)はAdobe Acrobat/Readerでは標準対応していませんし、毎年ルート証明書が更新して、同時に複数の有効なルート証明書がある証明書(商業登記証明書等)では、Adobe Acrobat/Readerでは検証できない時があります。『長期署名PAdESライブラリ』ではどちらも対応しています。

署名したPDFをWindows環境上のAdobe Acrobatで確認したところ、「署名の完全性は不明です」となっていました。また、その説明として「署名者の ID は信頼済み証明書の一覧に見つからず、親証明書も信頼済み証明書ではないため不明です」とありました。どうすれば正常に認識されるのでしょうか?

署名証明書が信頼されていないか、ルート証明書が信頼されていません。次の三通りの方法があります。

  1. 自分で信頼する証明書に登録する。
    たとえば、Adobe Acrobat/Readerの「署名のプロパティ」ダイアログから「概要」タブの「証明書を表示」をクリックすると、「証明書ビューア」ダイアログが開きます。ここの「信頼」タブで「信頼済み証明書に追加」の設定をします。 ただし、これは利用する環境すべてで設定する必要があります。
  2. 信頼されているパブリック認証局から証明書を購入する(有償です)
    WebTrust認定されたパブリック認証局であれば標準でWindows証明書ストアにルート証明書が信頼済みとなっています。この場合にはAdobe Acrobat/ReaderにWindows証明書ストアを利用する設定が必要です。
    • Adobe Acrobat/Reader 9以前であれば、「環境設定」ダイアログから「セキュリティ」の「詳細環境設定」をクリックすると「電子署名の詳細環境設定」ダイアログが開きます。そこの「Windows 統合」タブのチェックを全てオンにしておけば信頼されます。
    • Adobe Acrobat/Reader X以降であれば、「環境設定」ダイアログから分類「署名」>「検証」の「詳細」をクリックして「署名検証の環境設定」ダイアログを開きます。そこの「Windows 統合」のチェックを全てオンにしておけば信頼されます。
      Adobe Acrobat「署名検証の環境設定」ダイアログ
      デフォルト設定はWindows証明書ストアを利用しない状態になっているため、この設定が必要となります。
  3. その他、使用している証明書のルート証明書が標準でWindows環境に入っていない場合は、必要なルート証明書を取得し、Windows証明書ストアの「信頼されたルート証明書機関」にインポートする必要があります。Windows証明書ストアの証明書は、「コントロールパネル」>「ネットワークとインターネット」>「インターネット オプション」で「インターネットのプロパティ」ダイアログを開き、「コンテンツ」タブから「証明書」をクリックすることで画面を開くことができます。

署名したPDFをAcrobatで確認したところ、「有効な証明済み」とはなっているのですが、「署名は有効ですが、署名者のIDが失効しているかどうかを確認できませんでした」という説明がついてしまいました。これはどうすれば解決できるのでしょうか?

これは『長期署名PAdESライブラリ』の問題ではなく、CRL(失効した証明書のリスト)またはOCSP(証明書の失効問合せ)の取得に失敗している可能性が高いです。ネット環境としてCRL配布ポイントやOCSPサーバにアクセス可能かどうかを確認してください。特に取得にLDAPを使っている場合にはファイアーウォール等で許可されていない場合があります。他にも認証局のサーバが一時的にメンテナンスを行なっている場合にもこのエラーが出ることがあります。この場合は、時間をおいて試すことで成功します。

自分で生成した証明書(秘密鍵)で署名を行い、作成されたPDFを別マシンに持っていた際に、証明書が無いため、署名の有効性が不明となります。この場合、署名自体に信頼がないとしても、PDFが変更されていないことが保証されていると考えてよいでしょうか?

無効の理由として「署名後、文書が変更されたか壊れています」と出なければ改変されていないと言う事になります。ただし秘密鍵が流出して偽造されたかどうかの確認は、署名者が確認でき無いので保証できません。

Adobe Acrobat/Readerで複数の署名を検証すると最初の署名の後に「その他の変更が1個あります」と表示されますが、『長期署名PAdESライブラリ』の検証結果には表示されません。この表示の意味は何でしょうか?また『長期署名PAdESライブラリ』でもこの変更を判断できますか?

署名後に署名を追加した、と言うことが「その他の変更」として表示されます。つまり署名した後に何か追加した場合に表示されます。増分更新と言う仕組みで追加していますので、その前の署名自体は正しく検証できます。
『長期署名PAdESライブラリ』でこの増分更新をチェックするには LePAdES::getSign() で署名辞書の情報を取得して、PdaSign::getByteRange() で署名範囲(ByteRange)を取得して判断します。ByteRangeでは [開始位置1 長さ1 開始位置2 長さ2] の4つの数値が取得できます。このうち「開始位置2+長さ2」がその署名のサイズです。ファイルサイズがこの値よりも大きい場合には、署名後に追加(その他の変更)があったと判断できます。

Adobe Reader/Acrobatで検証すると「署名検証中のエラー この署名のフォーマットはこの署名方法ではサポートされていません。新しいバージョンの署名ハンドラが必要である可能性があります。」と表示されます。どうすれば良いでしょうか?

CAdESを使った電子署名(PAdES-Enhanced)またはDocTimestamp(ドキュメントタイムスタンプ)を、Adobe Reader/Acrobat 9以前で開いています。Adobe Reader/Acrobat X以降を利用して検証してください。

検証に利用するCRLとOCSPとは何が違うのでしょうか?どちらを利用すれば良いのでしょうか?

CRLは失効した証明書のリストを使って失効していないことを確認する仕組み、OCSPは証明書の失効をサーバーに問合せして確認する仕組みです。どちらを使うかは認証局で決められており、普通は証明書にCRLやOCSPの情報が記載されています。従って自動的にCRLかOCSPを使って失効検証が行われますので、通常はどちらと指定する必要はありません。

『長期署名PAdESライブラリ』で商用タイムスタンプを付けたのですが、Adobe Acrobat/Readerで署名を検証すると、時刻が不明になってしまいます。

この現象は、Acrobat/Adobe Readerでタイムスタンプ局の証明書の信頼性を検証できない状態になっている時に生じます。(※ Adobe Acrobat/Reader 7はSHA-2方式に対応していません。SHA-2を利用している日本の商用タイムスタンプの検証はできませんので、ご注意ください)

その他(性能等)について

何か制限があれば教えてください。

現在入力ファイルのサイズが200MBに制限されています(カスタマイズ対応は可能です)。他にも細かい制限がありますが、詳しくは動作環境/制限事項をご覧ください。

動作環境/制限事項

何かオープンソースのプロジェクトやライブラリを利用していますか?またそれに伴うライセンス的な制限はありませんか?

幾つかのオープンソースを利用しています。
利用しているのは、OpenSSL/OpenLDAP/libjpeg/libpng/libxml2/zlib/iconv/AES/MD5です。いずれも商用利用可能かつソースコード公開の義務が無いライブラリです。コピーライト表示は必要なものがありますが、詳しくは製品マニュアルに記載されています。評価版を入手してご覧ください。

署名を付与する場合の性能を教えてください。

以下にベンチマーク結果を示しますが、利用環境やPDFファイルによって変動しますので参考程度とお考えください。

○ コマンドラインによる署名試験
コマンドラインを使い署名をループして繰り返し(1000または100ループ)実行

  • 実行マシン:Intel Core i7 3.4GHz/4core/mem 8GB/Windows 7 Pro x64
  • 実行環境:CentOS 5.7 64bit/2CPU/mem 2.8GB
    • 実行マシン上のVMwareで実行環境を利用
    • タイムスタンプは付与していないので注意
入力ファイル 121ページ
200KB
140ページ
1MB
873ページ
12MB
1310ページ
32MB
同時1実行(2core) 14.5署名/秒 16.9署名/秒 1.42署名/秒 0.94署名/秒
同時2実行(2core) 13.5署名/秒 15.9署名/秒 --- ---
同時4実行(2core) 6.14署名/秒 6.45署名/秒 0.99署名/秒 0.71署名/秒

○ JAVA APIによる検証試験
JAVA APIを使い検証をマルチスレッドで64同時実行

  • 実行マシン:P4/Xeon 3GHz/4core/2CPU/mem 1GB/Linux Debian 5 32bit/RAID
  • CRLは社内ネットなので高速の為ほぼ遅延無し
入力ファイル 3ページ 44KB
同時64実行(4core×2CPU) 52.6検証/秒
  • ※ メモリ総利用量は25~30MB程度(Java実行環境を含む)
  • ※ メモリ利用量はPDFファイルサイズに依存する(現在はメモリ上に保持の為)

署名を付与する場合にメモリサイズは性能に影響しますか?

大きな入力ファイルを同時に処理する場合にはメモリサイズが足りなくなり性能が低下する可能性があります。小さな入力ファイルを使っている場合はメモリサイズの影響はほとんどありません。

マルチスレッドに対応していますか?

はい対応しています。スレッド毎にインスタンスを生成して利用してください。