PHP は、TCPDF ライブラリを通じて生成された PDF ファイルにデジタル署名します。
効果は次のとおりです。
これは、署名証明書が信頼できる証明書のリストにないためです。
目次
電子証明書を準備する
1. 電子証明書を申請する
デジタル証明書を申請したり、CA 機関やサーバー プラットフォームに申請して取得できる SSL 証明書を使用したりできます。
申請後の証明書ファイルに crt ファイルがあれば、そのまま電子署名を作成できます。
そうでない場合は、コマンドを使用して crt ファイルを取得できます。
SSL証明書による署名など
証明書ディレクトリは次のとおりです。
IIS で pfx ファイルを介して crt 証明書を取得します。
パスワードファイルが添付されており、crtの作成にはパスワードが必要です。
コマンドは次のとおりです。
openssl pkcs12 -in fullchain.pfx -out tcpdf.crt -nodes
コマンドラインを入力した後、パスワードを入力する必要があります(パスワードを入力せずにEnterを押します)。
これで、デジタル署名に必要な証明書ファイルを取得できます。
2. 自己署名証明書
自己署名証明書を作成することが可能です。
Tcpdf の自己署名証明書コマンドは次のとおりです。
自己署名を作成します。
openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
プロセスは次のとおりです。
一部の証明書情報を入力する必要があります。
他の形式に変換するための 2 つのコマンドが付属しています。
crt を p12 にエクスポートします。
openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
PFX 証明書を PEM に変換します。
openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
プログラムで使用するために証明書をプロジェクト ディレクトリにダウンロードします。
TCPDFをインストールする
インストールコマンド
composer require tecnickcom/tcpdf
証明書の署名
認証パスを設定する
ファイルの先頭の後には、ルート ディレクトリ内のファイル パスが続く必要があります。
$certificate = 'file://common/tcpdf.crt';
証明書情報の設定
$info = array(
'Name' => '测试数字签名',
'Location' => '北京',
'Reason' => '测试数字签名',
'ContactInfo' => 'http://new.solveset.com',
);
文書の署名を設定する
$pdf->setSignature($certificate, $certificate, '123456yjl', '', 2, $info);
署名の外観を設定する
画像署名の外観
// 创建签名内容(图像和/或文本)
$pdf->Image('common/southeast.jpg', 180, 70, 15, 15, 'JPG');
// 定义签名外观的活动区域
$pdf->setSignatureAppearance(180, 70, 15, 15);
空の署名の外観
$pdf->addEmptySignatureAppearance(180, 90, 15, 15);
完全なコード
$pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// 设置文档信息
$pdfName = '测试文档';
$pdf->SetCreator($pdfName);
$pdf->SetAuthor('YJL');
$pdf->SetTitle($pdfName);
$pdf->SetSubject($pdfName);
//设置字体 stsongstdlight支持中文
$pdf->SetFont('stsongstdlight', '', 10);
// 设置图片比例因子
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// 设置自动分页 距离底部多少进行分页
$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);
// 第一页
$pdf->AddPage();
$html = '<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>购销合同</title>
</head>
<body>
<div class="content">
<h3 align="center">购销合同</h3>
<p>(供方)(以下简称乙方):</p>
<p>经协商同意,根据中华人民共和国经济法的规定,订立合同如下:</p>
<p>一、 产品名称、商标、型号、厂家、数量、价格、供货时间:</p>
<p>二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议</p>
<p>三、 交(提)货地点、方式:使用快递</p>
<p>四、 运输方式及到达站港和费用负担:送货上门、供方负担</p>
<p>五、 合理损耗及计算方法:无</p>
<p>六、 包装标准、包装物的供应与回收:原包装、不回收。</p>
<p>七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。</p>
<p>八、 结算方式及期限:货到验收合格、发票到后一周内付款。</p>
<p>九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。</p>
<p>十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。</p>
<p>十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。</p>
<p> </p>
<p>订立合同人:</p>
</div>
</body>
</html>'
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '1', true);
// 数字签名
// 设置证书路径 必须file开头接根目录下文件路径
$certificate = 'file://common/tcpdf.crt';
// 设置证书信息
$info = array(
'Name' => '测试数字签名',
'Location' => '北京',
'Reason' => '测试数字签名',
'ContactInfo' => 'http://new.solveset.com',
);
// 设置文档签名
$pdf->setSignature($certificate, $certificate, '123456yjl', '', 2, $info);
// 设置签名外观
// 创建签名内容(图像和/或文本)
$pdf->Image('common/southeast.jpg', 180, 70, 15, 15, 'JPG');
// 定义签名外观的活动区域
$pdf->setSignatureAppearance(180, 70, 15, 15);
// 设置空签名外观
$pdf->addEmptySignatureAppearance(180, 90, 15, 15);
// 四种模式 I输出、D下载、F保存本地、S输出二进制字符串
$fileNewName = $fileDir . $filename;
$pdf->Output( 'test.pdf', 'I');
要約する
公式 Web サイトの例によると、実際のシナリオと組み合わせて自己署名証明書を作成することで、デジタル署名アプリケーションが作成されます。
注意すべき点は、デジタル署名は 1 つだけ追加できることです。2 つ設定すると、2 番目の位置が署名の座標を上書きし、最初の署名が 2 番目の位置になります。