【问题标题】:Digitally signing a PDF, using PHP, Zend, and openssl使用 PHP、Zend 和 openssl 对 PDF 进行数字签名
【发布时间】:2012-06-09 20:19:46
【问题描述】:

我正在尝试使用 PHP、openssl 和 Zend 框架(用于 pdf 重新处理/处理)构建一个简单的 PDF 文档签名例程。

我找到了this,但它根本不起作用,Zend 无法打开任何 pdf,甚至 Zend 自己的测试 pdf 也无法打开,Zend 不会报告原因,只是它“不能”。

我很确定我能够有效地创建密钥/证书,因为这是有据可查的,但是是否有可靠的方法将生成的证书附加到 PDF,就像上面的 Zend 扩展所暗示的那样?

function DigiSignPDF ($pdf_sign_request) {
    if (get_magic_quotes_gpc()) {
        $new_pdf = stripslashes($pdf_sign_request['raw_pdf']);
    } else {
        $new_pdf = $pdf_sign_request['raw_pdf'];
    }
    $test_pdf = stripslashes(file_get_contents('path/Some.pdf'));
    $test_pdf2 = ('path/Some.pdf');
    $pdf = Zend_Pdf::load($new_pdf2);
    //below is the signing code, from another library, it works as long as Zend_Pdf works
    $certificate = file_get_contents('path/certificate.p12');
    $certificatePassword = 'test123';

    if (empty($certificate)) {
        throw new Zend_Pdf_Exception('Cannot retrieve/generate the certificate.');
    }
    $pdf->attachDigitalCertificate($certificate,$certificatePassword);
    $eSig_pdf = $pdf->render();
    file_put_contents('path/signed_pdf.pdf', $eSig_pdf);
}

编辑,添加代码:只有当我使用“test_pdf2”作为 Zend_Pdf 的输入时,上述内容才有效。它可以毫无问题地将证书识别为二进制文件,但我需要能够在不将其写入磁盘的情况下传递 PDF。

【问题讨论】:

  • 好的,所以我可能已经更接近了。发生的事情是 PHP 坚持在文件中插入斜杠、换行符、回车符,无论我是上传文件还是使用 file_get_contents 从本地磁盘读取文件。我知道并尝试过使用stripslashes、声明magic_quotes 等。如果我让Zend_Pdf 直接读取文件,我只能让它工作,这对我不起作用,因为我们不会将这些文件中的任何一个写入磁盘,永远。有没有办法让 PHP 相信它不应该篡改被要求处理的数据?
  • 我们可以查看您用于处理 PDF 的代码吗?将其编辑到您的问题中。
  • 解决了这个问题,因为我将内容作为字符串传递给 Zend_Pdf,我应该一直使用 Zend_Pdf::parse($new_pdf);,正如手册中很可能所说的那样。 (哎呀)
  • 进一步;正如这里的几篇文章所建议的那样,通过迁移到 TCPDF,我解决了几乎所有关于对各种版本的 PDF 和表格组成部分进行数字签名的问题。但是,在使用字符串时,TCPDF 遇到了类似的警告,请确保您使用的是 TCPDF 的“writeHTMLCell”而不是“writeHTML”。并注意 PHP 的“magic_quotes”、错误的空格、编码和 goblins。
  • ^ 我建议您将解决方案添加为答案(此处作为标准做法)并删除上面的解决方案 cmets。

标签: php zend-framework pdf openssl sign


【解决方案1】:

TCPDF支持signing的pdf文件。也许你在源代码中发现了一些有用的东西。

【讨论】:

  • 我确实遇到了那个库,很遗憾我们将无法使用任何外部代码(现有的 zend 框架除外)。不过建议很好。
  • @user1437888 - 您可以编辑您的问题以指定该条件吗?如果您能提供一些背景来说明为什么会这样,那就更好了 - 它可能有助于指导答案。
【解决方案2】:

根据 halfer 的建议添加我的解决方案作为答案:解决了这个问题,因为我将内容作为字符串传递给 Zend_Pdf,我应该一直使用 Zend_Pdf::parse($new_pdf);,因为它很可能在手册。 (哎呀)

进一步;正如这里的几篇文章所建议的那样,我通过迁移到 TCPDF 解决了几乎所有我对各种版本的 PDF 和表格组成部分进行数字签名的问题。但是,在使用字符串时,TCPDF 遇到了类似的警告,请确保您使用的是 TCPDF 的“writeHTMLCell”而不是“writeHTML”。并注意 PHP 的“magic_quotes”、错误的空格、编码和 goblins。

【讨论】:

  • 这个user 问:我能有“attachDigitalCertificate()”这个函数吗?我尝试使用 zendpdf 对 PDF 进行数字签名,但遇到了一些问题。
猜你喜欢
  • 2018-12-07
  • 2012-06-02
  • 2016-04-25
  • 1970-01-01
  • 2011-04-03
  • 2010-09-30
  • 1970-01-01
相关资源
最近更新 更多