【问题标题】:Digital Sign PDF File with PHP and laravel使用 PHP 和 laravel 进行数字签名 PDF 文件
【发布时间】:2016-04-25 01:24:57
【问题描述】:

你好,在提出这个问题之前我搜索了很多。 我知道有一个付费选项来签署 pdf setasign.com

我尝试使用php函数:

openssl_pkcs7_sign( FULL_PATH . "/pdforiginal.pdf", //ORIGIANL PDF
                    FULL_PATH ."signedPDF.pdf", // SIGNED PDF
                    "file://" . FULL_PATH . "signing_cert.pem", 
                     array(  "file://" . FULL_PATH. "private_key.pem",""),array()); 

signing_cert.pem

我的私钥没有密码我应该使用空白“”还是空?

如果有人能给我关于这个主题的一些信息,那将非常有帮助。

【问题讨论】:

  • 密钥的正确路径是 file://home... 而不是 file:///home... 对吗?仍然不明白如何处理无密码,如果 private_key 相同,则有signing_cert。所以我相信它没有重复。

标签: php pdf laravel-5 openssl digital-signature


【解决方案1】:

我找到了解决方案。 我使用 FPDI 库打开 pdf 并使用 tcpdf 库对其进行签名。 这使得过程非常简单。

require_once('tcpdf_include.php');

require_once "fpdi.php";

$pdf = new FPDI('P', 'mm', 'A4'); //FPDI extends TCPDF

$pages = $pdf->setSourceFile('document.pdf');



/*
NOTES:
 - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
 - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
 - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
*/

$certificate = 'file://data/cert/tcpdf.crt';

// set additional information
$info = array(
    'Name' => 'TCPDF',
    'Location' => 'Office',
    'Reason' => 'Testing TCPDF',
    'ContactInfo' => 'http://www.tcpdf.org',
    );

for ($i = 1; $i <= $pages; $i++)
    {
        $pdf->AddPage();
        $page = $pdf->importPage($i);
        $pdf->useTemplate($page, 0, 0);


        // set document signature
        $pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);      

}

【讨论】:

  • 您使用了哪个证书提供商?
  • 我生成自己的证书。用代码上的命令注释。
  • @CarlosBranco 您在这里使用了哪个包。你能附上链接吗?
  • 嗨,我有一个问题,这一行是否 $pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);签署文件或使其可签署?
  • 嗨,签署文件。至少当我打开文档时,我可以看到证书。
【解决方案2】:

现在数字证书正在加密设备上发布,即。 USB 令牌和智能卡,用户将持有相同的,服务器可能没有用户证书的私钥。在 Web 应用程序中,您需要从连接到客户端(浏览器)设备的 USB 令牌或智能卡获取签名的 pdf(哈希)。

您需要从浏览器本身获取 pdf 签名,因为私钥永远不会来自 USB 令牌。请参考答案https://stackoverflow.com/a/55676351/9659885

对于 PHP,可以通过运行在 Tomcat 上的 JavaBridge 通过 Apache 代理使用容易获得的 Java pdf 库或任何 pdf 组件,从浏览器 USB 令牌和服务器端的 PHP 对 PDF 进行数字签名。

【讨论】:

    【解决方案3】:

    我找到了更好的签名解决方案,但不仅限于 PHP。您需要使用 exec() 命令来执行此操作。

    1 - 需要安装java。 Linux sudo apt install /select_folder/default-jre

    2 - 需要安装 Portable Signer。下载 ZIP 文件并运行文件 jar (https://sourceforge.net/projects/portablesigner/files/portablesigner/2.0-Release/PortableSigner-Generic-2.0.38c0573.zip/download)。 Linux sudo java -jar /select_folder/PortableSigner.jar

    3 - 安装 Portable Signer 并选择安装文件夹后,使用手册 (http://portablesigner.sourceforge.net/) 在 php 中使用命令 exec() 执行应用程序。

    示例: exec("java -jar PortableSigner.jar -n /Users/pfp/Desktop/unsigned.pdf -o /Users/pfp/Desktop/signed.pdf -s /Users/pfp/Desktop/certificate.pfx -p我的秘密密码");

    在文档中,您有许多签名选项。我希望这对这里的 PHP 社区有很大帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 2018-12-07
      • 1970-01-01
      • 2015-06-20
      • 2011-04-03
      • 1970-01-01
      相关资源
      最近更新 更多