You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用TCPDF实现数字签名遇验证失效问题求助

修复TCPDF数字签名无效问题

你的代码核心问题是误解了TCPDF数字签名的流程,手动生成签名并拼接到内容中的操作完全错误,导致Adobe无法验证签名。以下是正确的实现方案:

错误点分析

  • 不需要手动调用openssl_pkcs7_sign生成签名,TCPDF的setSignature方法会自动完成文档哈希计算、签名生成和嵌入操作。
  • 签名是对最终PDF文档的哈希值进行加密,而非对原始HTML内容单独签名后拼接。
  • 若私钥带有密码,需要在setSignature中补充密码参数。
  • 确保证书文件包含完整的证书链(若使用CA签发的证书),否则Adobe无法验证信任链。

正确代码实现

<?php
require_once "vendor/autoload.php";

// 直接使用TCPDF,若需要合并现有PDF再签名才用Fpdi
use TCPDF;

// HTML内容
$htmlContent = "<h1>Hello World!</h1><p>This is a digitally signed document.</p>";

// 私钥、证书路径(确保文件权限正确,PHP能读取)
$privateKey = "/home/newkabir/public_html/docuSign/certificates/ankitpanwar.pkey";
$certificate = "/home/newkabir/public_html/docuSign/certificates/ankitpanwar.cer";
$privateKeyPassword = ""; // 若私钥有密码,填写此处

// 初始化TCPDF
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Ankit Panwar');
$pdf->SetTitle('Digitally Signed Document');
$pdf->SetSubject('Digital Signature Demo');

// 添加页面
$pdf->AddPage();

// 写入HTML内容
$pdf->writeHTML($htmlContent, true, false, true, false, '');

// 设置数字签名参数
// 参数说明:私钥路径、证书路径、证书密码、临时文件路径(留空用系统临时目录)、签名类型(2=PKCS#7)、签名信息
$pdf->setSignature(
    $privateKey,
    $certificate,
    $privateKeyPassword,
    '',
    2,
    [
        "Name" => "ankit panwar",
        "Location" => "ajmer",
        "Reason" => "for demo purpose",
        "ContactInfo" => "your-contact@example.com"
    ]
);

// 添加签名外观(可选,若需要在PDF中显示签名区域)
$pdf->setSignatureAppearance(150, 60, 50, 20); // x, y, width, height

// 输出签名后的PDF到文件
$outputPath = "/home/newkabir/public_html/docuSign/signed_document.pdf";
$pdf->Output($outputPath, "F");

echo "PDF已成功签名并导出至:{$outputPath}";
?>

额外注意事项

  • 确保私钥和证书文件的权限正确:PHP进程需要读取权限(如设置为644),避免权限不足导致无法读取文件。
  • 若使用自签名证书,Adobe默认会提示“签名未知”,需要手动将证书导入Adobe的信任列表才能显示“有效”。
  • 检查证书格式:确保.cer文件是PEM格式,私钥.pkey也是PEM格式(无额外加密格式问题)。
  • 若需要对现有PDF进行签名,才使用Fpdi,此时需要先导入现有PDF页面,再添加签名。

内容的提问来源于stack exchange,提问作者Ankit Panwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:06:28