PHP 对PDF文件实现数字签名

这篇具有很好参考价值的文章主要介绍了PHP 对PDF文件实现数字签名。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PHP通过TCPDF库对生成的PDF文件进行数字签名。

效果如下:

PHP 对PDF文件实现数字签名

这个是因为签名证书不在可信任证书列表中。

目录

准备数字证书

1.申请数字证书

2.自签名证书

安装TCPDF

证书签名

设置证书路径

设置证书信息

设置文档签名

设置签名外观

图像签名外观

空签名外观

完整代码

总结


准备数字证书

1.申请数字证书

可以申请数字证书也可使用ssl证书,通过向CA机构或服务器平台申请获得。

申请后的证书文件,如果有crt文件,即可直接使用创建数字签名。

若没有,可通过命令获取crt文件。

如通过ssl证书签名

证书目录如下:

PHP 对PDF文件实现数字签名

通过IIS下的pfx文件获得crt证书

PHP 对PDF文件实现数字签名

附带有密码文件,创建crt需要密码。

命令如下:

openssl pkcs12 -in fullchain.pfx -out tcpdf.crt -nodes

命令行输入后,需要填写密码(没有密码直接回车),

之后就可得到数字签名所需的证书文件。

2.自签名证书

可以创建自签名证书。

Tcpdf中自签名证书命令如下:

创建自签名:

openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt

过程如下:

需要输入一些证书信息。

PHP 对PDF文件实现数字签名

附带两条转成其他格式的命令。

将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

证书签名

设置证书路径

必须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);

完整代码

$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');

总结

按照官网的示例,通过创建自签名证书结合自己的实际场景做了一个数字签名应用。

有一点要注意,只能添加一个数字签名,设置两个的话,第二个的位置会覆盖签名的坐标,导致第一个签名在第二个位置。文章来源地址https://www.toymoban.com/news/detail-509684.html

到了这里,关于PHP 对PDF文件实现数字签名的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PDF控件Spire.PDF for .NET【安全】演示:使用时间戳服务器对 PDF 进行数字签名

    Spire.PDF for .NET 是一款独立 PDF 控件,用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库,开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理,且无需安装 Adobe Acrobat。 E-iceblue 功能类库Spire 系列文档处理组件均由中国本土团队研发,不依赖第三方软件

    2024年04月10日
    浏览(55)
  • python实现对称加密、数字签名、数字证书颁发

    一.开发目的: 理解开源密码库实现的基本架构,熟悉对称算法的加解密函数封装与调用,并能能够利用开源设计接口进行二次封装,并实现一个界面友好,功能正确的采用对称算法的文件加解密工具。 二.开发环境: 硬件环境: 处理器:Intel®Core™i5-1035G1 CPU @1.00GHz 1.19GHz2

    2024年02月13日
    浏览(41)
  • Java实现基于RSA的数字签名

    1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 问题:在比特币中,怎么证明这个交易是你发布的? 这是就需要用到数字签名,数字签名大概可已描述为:用私钥加密,用公钥解密。发布

    2024年02月11日
    浏览(52)
  • SpringCloudGateway实现数字签名与URL动态加密

    再网络传递数据的时候,为了防止数据被篡改,我们会选择对数据进行加密,数据加密分为对称加密和非对称加密。其中RSA和AES,TLS等加密算法是比较常用的。 对称加密是指加密和解密使用相同的密钥的加密方法。其基本流程包括以下步骤: 密钥生成 : 双方协商生成一个共

    2024年02月07日
    浏览(35)
  • 【图解DSA数字签名算法】DSA签名算法的Python实现 | 物联网安全 | 信息安全

    系列索引:【图解安全加密算法】加密算法系列索引 Python保姆级实现教程 | 物联网安全 | 信息安全 DSA数字签名算法基于SHA1哈希算法,关于SHA1的实现看另一篇文章。 数字签名标准(DSS)由NIST公布,该标准能够使接收者能够验证数据的完整性和数据发送者的身份而制定,所采用

    2024年02月06日
    浏览(53)
  • php+tcpdf生成pdf:中文乱码

    亲测成功,感谢分享! 查看原文 TCPDF是一个生成PDF的不错的库,可惜,官方对包括中文在内的东亚字体支持不怎么样的。 场景:某项目需要根据数据库信息生成pdf格式的发票,考虑采用稳定的tcpdf,虽然还有许多其它选择,但是这个应该是首选,不说原因了。 可是发现一个

    2024年02月09日
    浏览(43)
  • Linux gpg命令(gpg指令、gpg加密工具)(GNU Privacy Guard、GnuPG)文件压缩加密、文件加密、文件解密、文件压缩密码、解压密码、GPG密钥、数字签名、非对称加密

    GNU Privacy Guard (GnuPG或GPG) 是一个完全免费的开源实现,用于OpenPGP标准的数据加密和解密。这种加密方式可以用于保护敏感数据,确保其在传输过程中不被截获或篡改。本文将介绍在Linux环境中如何使用GPG加密工具。 安装gpg 在大多数Linux发行版中,GPG已经预先安装了。 如果未安

    2024年02月03日
    浏览(85)
  • 安装软件和驱动程序需要微软数字签名无法安装?数字签名和数字证书区别

    1.安装软件和驱动程序需要微软数字签名无法安装 windows安装exe安装包时: 1.1  解决方法: 1.2           这个问题需要安装驱动补丁进行更新驱动操作,如:Windows6.1-sha2补丁.msu 1.3           这种属于签名问题,解决方法: 1..进入“控制面板”,查看方式为大图标,点击“

    2024年02月05日
    浏览(75)
  • Java - 数字签名与数字证书

    SSL是一种安全协议,用于在网络传输中提供数据加密、身份验证和完整性保护。它基于传输层协议(如TCP),并为其提供加密和安全功能。 对称加密和非对称加密 : 对称加密 :使用相同的密钥进行加密和解密。 非对称加密 :使用两个密钥:公钥用于加密,私钥用于解密。

    2024年01月24日
    浏览(49)
  • 代码签名工具有哪些?好用的数字签名工具推荐

    代码签名(Code signing)是对各类软件代码文件进行数字签名,以确认软件发行者身份并保证软件在签名后未被篡改,它使用数字证书来识别软件的发布商,使用哈希算法来确保软件的完整性。代码签名机制借助PKI密码技术及数字证书,规范了软件的发行,帮助开发者和最终用

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包