【问题标题】:Php signing PDF using openssl_pkcs7_sign使用 openssl_pkcs7_sign 对 PDF 进行 PHP 签名
【发布时间】:2020-06-28 17:49:07
【问题描述】:

我在 Win 10/PHP 7.3/Laravel 上,我正在尝试使用以下生成的证书文件签署 PDF:

openssl genrsa -out my-private-key.pem 2048
openssl req -new -key my-private-key.pem -x509 -days 3650 -out my-public-key.pem

但是当我打开bearing_signed.pdf 时,它不包含签名。以下是我目前正在使用的代码块:

        openssl_pkcs7_sign(
          $app_path . 'bearing.pdf',
          $app_path . 'bearing_signed.pdf',
          "file://" . $app_path . "my-public-key.pem",
          array("file://" . $app_path . "my-private-key.pem", ""),
          array(
            "To" => $to_email,
            "From" => env('MAIL_FROM_NAME') . '<' . env('MAIL_FROM_ADDRESS') . '>',
            "Subject" => $data['subject']
          ),
          PKCS7_BINARY
        );

        // convert PEM to DER
        $pem_data = file_get_contents($app_path . 'bearing_signed.pdf');
        $begin = "Content-Transfer-Encoding: base64";
        $pem_data = trim(substr($pem_data, strpos($pem_data, $begin) + strlen($begin)));
        $der = base64_decode($pem_data);

        $fp = fopen($app_path . 'bearing_signed.pdf', "w");
        if ($fp) {
          fwrite($fp, $der);
          fclose($fp);
        }

这段代码有什么问题?

【问题讨论】:

  • 一般情况下,需要签署 PDF 的不是使用自签名证书,而是使用认证机构颁发的证书...如果对您有用,请参考SO answer...

标签: digital-signature php-7.3


【解决方案1】:

我找到了更好的签名解决方案,但不仅限于 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 社区有很大帮助。

【讨论】:

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