🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PDF

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

Q&A

解決済

1回答

7901閲覧

TCPDFを用いた電子署名について

lapas

総合スコア8

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PDF

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

0グッド

0クリップ

投稿2019/10/23 04:35

前提・実現したいこと

お世話になります。
TCPDFを用い、PDFに電子署名するシステムをLaravelで作っています。
エラーが発生し、電子署名が出来ません。

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

openssl_pkcs7_sign(): error getting private key

該当のソースコード

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Prefiles; use setasign\Fpdi\TcpdfFpdi; use Illuminate\Support\Str; use Illuminate\Support\Facades\Storage; class SignpdfController extends Controller { public function index(){ $user = \Auth::user(); $user_id=$user->id; $files = Prefiles::where('user_id', $user_id)->get(); foreach($files as $file){ $receipt = new TcpdfFpdi(); // PDFの余白(上左右)を設定 $receipt->SetMargins(0, 0, 0); // ヘッダー・フッターの出力を無効化 $receipt->setPrintHeader(false); $receipt->setPrintFooter(false); // テンプレートを読み込み $original_file=Storage::path('files/original/'.$file->new_name); $pageCount =$receipt->setSourceFile($original_file); //編集禁止 $receipt->SetProtection(array('modify'),'', Str::random(32)); for($i=1;$i<=$pageCount;$i++){ // ページを追加 $receipt->AddPage(); // 読み込んだPDFの1ページ目のインデックスを取得 $tplIdx = $receipt->importPage($i); // 読み込んだPDFの1ページ目をテンプレートとして使用 $receipt->useTemplate($tplIdx, null, null, null, null, true); $receipt->SetFont("kozgopromedium", '', 11); $receipt->SetXY(3, 3); $receipt->Write(0, mb_substr('test',0,24,"UTF-8")); // set certificate file $certificate = Storage::path('files/crt/tcpdf.crt'); // set additional information $info = array( 'Name' => 'TCPDF', 'Location' => 'Office', 'Reason' => 'Testing TCPDF', 'ContactInfo' => 'http://www.tcpdf.org', ); // set document signature $receipt->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info); // set font $receipt->SetFont('helvetica', '', 12); // add a page $receipt->AddPage(); // print a line of text $text = 'This is a <b color="#FF0000">digitally signed document</b> using the default (example) <b>tcpdf.crt</b> certificate.<br />To validate this signature you have to load the <b color="#006600">tcpdf.fdf</b> on the Arobat Reader to add the certificate to <i>List of Trusted Identities</i>.<br /><br />For more information check the source code of this example and the source code documentation for the <i>setSignature()</i> method.<br /><br /><a href="http://www.tcpdf.org">www.tcpdf.org</a>'; $receipt->writeHTML($text, true, 0, true, 0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // *** set signature appearance *** // create content for signature (image and/or text) $receipt->Image(Storage::path('files/crt/crt.png'), 180, 60, 15, 15, 'PNG'); // define active area for signature appearance $receipt->setSignatureAppearance(180, 60, 15, 15); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // *** set an empty signature appearance *** $receipt->addEmptySignatureAppearance(180, 80, 15, 15); } // PDFを出力 $receipt->Output(Storage::path('files/sign/'.$file->new_name), 'f'); $receipt=null; //return view('home'); } } }

試したこと

電子証明書の問題かと思い、opensslをインストールし電子証明書を作成しましたが、こちらも同じ結果でした。

return Storage::get('files/crt/tcpdf.crt')で証明書が表示されるので、パスの間違いでは無かったです。

下記の証明書とTCPDF電子署名方法を参考にしました。

tcpdf.crt
https://github.com/tecnickcom/TCPDF/blob/master/examples/data/cert/tcpdf.crt

Example 052 : digital signature certification
https://tcpdf.org/examples/example_052/

補足情報(FW/ツールのバージョンなど)

Laravel 6.0.3
PHP 7.3.5
tcpdf 6.3
fpdi 2.2.0
xampp
windows 10

解決方法をご存知の方、ご教授いただけますと大変助かります。
どうかお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

少し興味があったのでちょっと検索してみた感じ、
[PHP] OPENSSL_PKCS7_SIGN の使い方
のようなページが見つかりました。

ざっと見た感じ

php

1openssl_pkcs7_sign(realpath(“msg.txt”), realpath(“signed.txt”),file://”.realpath(email.pem”), array(“file:”.realpath(“email.pem”), “123456”), $headers);

のような内容があったので

php

1$certificate = Storage::path('files/crt/tcpdf.crt');

の部分のパスを調べて見て、プロトコル名"file://"を追加するようにしてみるとどうでしょうか?

投稿2019/10/23 05:39

yoorwm

総合スコア1305

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

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

lapas

2019/10/23 06:10

早速のご連絡をありがとうございます。 また、お調べいただき嬉しく存じます。 ご回答を参考にし $certificate = 'file://'.Storage::path('files/crt/tcpdf.crt'); と書き換えたところ、すんなりと成功いたしました。 大変有難いです。一日中 悩まずにすみました。 お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問