PHP は PDF ファイルにデジタル署名を実装します

PHP は、TCPDF ライブラリを通じて生成された PDF ファイルにデジタル署名します。

効果は次のとおりです。

これは、署名証明書が信頼できる証明書のリストにないためです。

目次

電子証明書を準備する

1. 電子証明書を申請する

2. 自己署名証明書

TCPDFをインストールする

証明書の署名

認証パスを設定する

証明書情報の設定

文書の署名を設定する

署名の外観を設定する

画像署名の外観

空の署名の外観

完全なコード

要約する


電子証明書を準備する

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 番目の位置になります。

おすすめ

転載: blog.csdn.net/json_ligege/article/details/131379147