前提・実現したいこと
お世話になります。
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
解決方法をご存知の方、ご教授いただけますと大変助かります。
どうかお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/23 06:10