質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

4166閲覧

TCPDF setTimeStamp()を使用したPDFのタイムスタンプ処理について

om.

総合スコア0

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/03/12 11:48

前提・実現したいこと

PHPのTCPDFにおいて、PDFにタイムスタンプを付与する

発生している問題・エラーメッセージ

setTimeStampというファンクションがありますが、タイムスタンプが付与されません。 通常の署名付きPDFが出力されます。

該当のソースコード

PHP

1//set tsa server url 2$tsa_host = 'https://freetsa.org/tsr'; 3//specify PEM file(Optional) 4$tsa_username = ''; 5//specify cert file password(Optional) 6$tsa_password = ''; 7//specify the path of crt file(Optional) 8$tsa_cert = ''; 9//setTimeStamp 10$tcpdf->setTimeStamp($tsa_host, $tsa_username, $tsa_password, $tsa_cert);

試したこと

setTimeStampによるタイムスタンプ付与を実現したいというのもあるのですが、
PDFのタイムスタンプとTCPDFのファンクションについて頭がごちゃごちゃになっているので、ひとまずこちらを整理できればと思います。
このファンクションを根本から理解するため、setTimeStampファンクションのほか、TSAやOpenssl・curlを使用したタイムスタンプリクエスト送信、PDFの内部構造などについて色々と調べてみましたが、
国内外問わずリファレンスがかなり少なく、推測の域をなかなか抜け出せないままスタックしてかなりの時間が経過しているので質問させていただきました。

ひとまず、PDFへのタイムスタンプ付与の仕組みについてはPDFへの署名時に使うCertificateファイルの証明書情報の中に、
タイムスタンプサーバーから返ってきたタイムスタンプレスポンスの中から取り出したタイムスタンプを、PKCS#7形式でPDFの指定の場所に埋め込むことで「タイムスタンプ埋め込み式署名」として機能する、ということは理解しています。

そしてここからなのですが、上記のように署名を行うには、まずタイムスタンプサーバーにリクエストを送る必要があり、その為の上記ソースコードなのだと思います。
しかしながら、TCPDFには署名自体を行うためのsetSignatureファンクションがあります。

php

1setSignature( $signing_cert = '', $private_key = '', $private_key_password = '', $extracerts = '', $cert_type = 2, $info = array(), $approval = '')

このファンクションでは、

  • $signing_certで証明書ファイルを指定
  • $private_keyで秘密鍵ファイルを指定
  • $private_key_passwordで秘密鍵ファイルのパスワードを指定

・・・などを行って、PDFに署名を施すことが可能ですが、前述の

タイムスタンプサーバーから返ってきたタイムスタンプレスポンスの中から取り出したタイムスタンプを、PKCS#7形式でPDFの指定の場所に埋め込むことで「タイムスタンプ埋め込み式署名」として機能する

ということを考えると、setSignatureファンクションをsetTimeStampファンクションと組み合わせてコーディングする必要があると考えています。
実際、setTimeStampファンクションのリファレンスをみてみると、概要に「Use with digital signature only!」との表記があります。
そのため、当初は単に「通常通りsetSignatureとsetTimeStampをコーデイングすればいいか」と考え、コーディングしましたが、setTimeStampが機能しません。
PHPの「上から順に処理される」という前提もありますので、記述順を変えてみたりなどしましたがなかなかタイムスタンプが付与されません。
あとは、単純にsetTimeStampのパラメータ設定が間違っているのかと思い、使用しているFreeTSA指定の証明書ファイル及びリクエストファイル指定を何度も見直してみましたが、こちらもダメでした。
また、独自でcurlのPOSTを用いてタイムスタンプ処理をTCPDFの処理に割り込ませることも考えましたが、こちらも撃沈しました。

そもそもPDFへはAdobe Readerにて増分更新でタイムスタンプを付与すればいい話なのですが、出来うる処理は全てサーバーライブラリにて処理を行いたく、開発を行なっております。
そのためTCPDFを利用することになるのですが、TCPDFは増分更新には対応していないという仕様があり、追加で別のタイムスタンプ署名を付与することはできないので、自ずとsetSignatureで指定した証明書及び秘密鍵ファイルを使用して生成される署名の中に含まれたタイムスタンプを利用することになると思います。
ただ、そうするとそもそもsetTimeStampでタイムスタンプサーバーを指定してもタイムスタンプが付与されないのでは?とも思っています。
加えて、タイムスタンプサーバーへリクエストをPOSTする際、対象データが必要となりますが、TCPDFのsetTimeStampファンクションには対象データを指定するパラメータがありません。
これはTCPDF内部で生成するPDFを対象データに指定されるようにしているのでしょうか。

また、こちらは別の疑問ですが、Certificate Transparencyに対応した証明書ファイルにはSCTが含まれておりますが、これはタイムスタンプサーバーのレスポンスから取り出すタイムスタンプとは異なるのでしょうか。

今月末までになんとか突破口を見つけたいのですが、どうしても根本からこれらの疑問を解消したいため、お時間の頂戴できる方にお伺いできれば幸いです。
よろしくお願いいたします。

参考サイト

下記のサイト様を参考にさせていただきました。
TCPDF::setTimeStamp()
FreeTSA.org
PDF/A に電子署名してみる
Let's EncryptのCertificate Transparency対応
Certificate Transparencyについて勉強会で発表したので、その補足や落ち穂拾い

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

om.

2021/03/12 12:44

承知いたしました。早速試してみます。 進展次第、改めてご報告いたします。 ありがとうございます。
om.

2021/03/12 14:33 編集

今ちょっと気になり、TCPDFライブラリに含まれる「tcpdf.php」というファイルの中身を確認したところ、タイムスタンプリクエストを送る制御をしているであろう、 /** * NOT YET IMPLEMENTED * Request TSA for a timestamp * @param $signature (string) Digital signature as binary string * @return (string) Timestamped digital signature * @protected * @author Richard Stockinger * @since 6.0.090 (2014-06-16) */ protected function applyTSA($signature) { if (!$this->tsa_timestamp) { return $signature; } //@TODO: implement this feature return $signature; } の、コメントアウトされている、「NOT YET IMPLEMENTED」と下層に付随するコードの「@TODO: implement this feature」がひっかかりました。 これはつまり、まだ実装されていない機能ということでしょうか。
om.

2021/03/13 15:31

ご返信が遅れ、申し訳ございません。 TCPDFは、こちらのバージョンを入れました。 https://github.com/tecnickcom/TCPDF 確かに、修正・追記された他のプロジェクトを探してみるのは盲点でした。 こちらでちょっと探してみます。 ご連絡いただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問