コロナの影響もあって世の中テレワークや電子化だと良くなった事も色々ありますね!
さて、今回はそんな中ちょっとニッチな話題「電子帳簿保存法(略して電帳法!)」のためのチップスになります。
この情報を開示する事でダメ出しとか賛同とかもらえたらほんっと助かりますOrz
電帳法とはざっくりなんだ?
知ってる人はここ読み飛ばしてね。電帳法とは本当にざっくりいうと、こんな感じ
①PDFファイル化した領収書とかをハッシュ化する
②そのハッシュ化した文字列が今現在存在した事を第三者機関に証明書(タイムスタンプ)を発行してもらう
③そのPDFファイルにその証明書を内蔵させる(10年とか有効だよ)
④紙は不要!さらば!
何が課題か?
理屈とか経緯どうでもいい方はここも飛ばしてね!
証明書は10年とか有効な訳ですが、証明書の延長処理というのがあります。その時に他所で勝手に付与されてたタイムスタンプが邪魔になる事があるんです。具体的には「A社がB社に領収書をPDFで送ってきて、既にタイムスタンプが付与されてました」というパターンです。
この時B社は電帳法において、そのPDFをどうしたらいいのか?がふわっとしてるんですね。(国が決めるべきと思いますが)
ちなみにそのA社のタイムスタンプが有効期限切れてから延長処理をした場合はとある第三者機関のライブラリだとエラーが発生したりします。
そのため、考えた案は「A社のPDFにタイムスタンプがついていたら、B社が用意したPDFの添付ファイルとして保存し、それにタイムスタンプ押しちゃおうよ」っていう話です。
本題:どうやってタイムスタンプの存在を検知するか?
PDFBoxの実装を追い切れてないけど、PDFBox使って検知するなら
// 1つでもSignatureFieldsに何かあるならタイムスタンプある!
PDDocument.load(new File("A社領収書.pdf")).getSignatureFields().size() > 0
とかで判定出来そうですね。
PDFをテキストデータとして考えたら以下のような方法もいけそう。
// 参考リンク:[なんとなく分かった気になるPDF電子署名仕様入門2]のP12 署名辞書を参考にね!
$ grep -a -e "Type/DocTimeStamp" -e "Type/Sig" A社領収書.pdf | wc -l
1 ←1つ署名があるって意味です。
bashのコマンドサンプルちょっと載せておきます。参考までに!
バイナリーの部分が可読性悪くするので適度な場所に改行入れて見たい所だけ見てるサンプルです。
$ cat A社領収書 | sed 's/\(ByteRange\)/\n\1/g' | sed 's/\(\/Type\)/\n\1/g' | grep -a -e "Type/DocTime
Stamp" -e "/Type/Sig" -e "/Type/DSS"
/Type/DocTimeStamp/SubFilter/ETSI.RFC3161/M(D:20140912135930+09'00')/
/Type/DocTimeStamp/SubFilter/ETSI.RFC3161/Filter/XXXXXX第三者業者XXXX/
/Type/DocTimeStamp/SubFilter/ETSI.RFC3161/Filter/XXXXXX第三者業者XXXX/
/Type/DSS/VRI 80 0 R/Certs 81 0 R/CRLs 86 0 R>>
ByteRangeと/Typeの手前で改行を入れて、TypeがDocTimestampとSigとDSSだけ出力してます。
ちなみにDSS出力してるのはLTV対応とか確認するのに使えるかなと。
でわでは。
参考リンク
なんとなく分かった気になるPDF電子署名仕様入門2
http://www.langedge.jp/download/jnsa/20131030-SUTF-4-pdfsign.pdf