使用 PHP、Zend 和 openssl 对 PDF 进行数字签名


Digitally signing a PDF, using PHP, Zend, and openssl

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

我已经找到了这个,但它根本不起作用,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。

TCPDF支持对pdf文件进行签名。也许你在源代码中找到了一些有用的东西。

根据半人的建议添加我的解决方案作为答案:解决了这个问题,因为我将内容作为字符串传递给Zend_Pdf,我应该使用 Zend_Pdf::p arse($new_pdf);,正如手册中很可能所说的那样。(哎呀)

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