带有 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 的例子。
我的私钥没有密码,我应该使用空白 "" 还是 null ?
如果有人能给我一些关于这个主题的信息,那将非常有帮助。
我找到了解决办法。
我使用 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 令牌。请参考答案
对于 PHP,可以通过 Apache 代理在 Tomcat 上通过 JavaBridge 运行 使用容易获得的 Java pdf 库或任何 pdf 组件从浏览器 USB 令牌和服务器端 PHP 对 PDF 进行数字签名。
我找到了更好的签名解决方案,但不仅限于 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 MySecretPassword ");
在文档中,您有很多签名选项。我希望这会对这里的 PHP 社区有很大帮助。
你好,我在提出这个问题之前搜索了很多。 我知道有一个付费选项可以签署 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 的例子。
我的私钥没有密码,我应该使用空白 "" 还是 null ?
如果有人能给我一些关于这个主题的信息,那将非常有帮助。
我找到了解决办法。 我使用 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 令牌。请参考答案
对于 PHP,可以通过 Apache 代理在 Tomcat 上通过 JavaBridge 运行 使用容易获得的 Java pdf 库或任何 pdf 组件从浏览器 USB 令牌和服务器端 PHP 对 PDF 进行数字签名。
我找到了更好的签名解决方案,但不仅限于 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 MySecretPassword ");
在文档中,您有很多签名选项。我希望这会对这里的 PHP 社区有很大帮助。