带有 PHP 和 laravel 的数字签名 PDF 文件


Digital Sign PDF File with PHP and laravel

你好,我在提出这个问题之前搜索了很多。我知道有一个选项可以签署 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 <-//我不明白这是什么,我只有private_key和public_key。我在这里看到一些人们使用private_key的例子。

我的私钥没有密码,我使用空白"或空?

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

我找到了解决方案。我使用 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);      
}
现在,

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

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

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

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

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

2 - 需要安装便携式签名器。下载 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 - 安装便携式签名器并选择安装文件夹后,使用手册(http://portablesigner.sourceforge.net/)和命令exec()在php中执行应用程序。

例:exec("java -jar PortableSigner.jar -n/Users/pfp/Desktop/unsigned.pdf -o/Users/pfp/Desktop/signed.pdf -s/Users/pfp/Desktop/certificate.pfx -p MySecretPassword");

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