首页 > 解决方案 > 在nodejs中使用加密签署pdf文档

问题描述

感谢 Multer,我从前端发送一个 pdf 文件并正确存储在 nodejs 端。

我有这个内容的一个功能:

async function signDocument ( req, res ) {
  const privateKey = fs.readFileSync ( './config/privateKey.pem', 'utf-8' ),
        publicKey  = fs.readFileSync ( './config/publicKey.pem', 'utf-8' ),
        file       = fs.readFileSync ( req.file.path, 'utf-8' ),
        signer     = crypto.createSign ( 'sha256' )

  signer.update ( file )
  signer.end ()

  const signature  = signer.sign ( privateKey ),
        signature_hex = signature.toString('hex'),
        verifier   = crypto.createVerify ( 'sha256' )

  verifier.update ( file )
  verifier.end ()
  const verified = verifier.verify ( publicKey, signature )
  console.log ( JSON.stringify ( {
    signature : signature_hex,
    verified
  }, null, 2 ) )
}

下一步,我打开正确保存在指定文件夹中的文件,但 pdf 文件未在 acrobat reader 中显示为已签名(例如)

对此代码的任何帮助都不会引发错误,但它不起作用..

谢谢!

标签: node.jscryptographymulter

解决方案


此代码创建简单的 PKCS #1 签名。您需要创建 PAdES 或 PKCS #7 签名并将其也插入 PDF。请参阅此模块,它将帮助您进一步https://github.com/vbuch/node-signpdf

这段代码是如何工作的?它来自库测试套件https://github.com/vbuch/node-signpdf/blob/master/src/signpdf.test.js

如果您将缓冲区保存到新的 PDF 文件中,那么您应该在使用 Adob​​e 打开时看到数字签名。

it('signs a ready pdf containing a link', async () => {
    const p12Buffer = fs.readFileSync(`${__dirname}/../resources/certificate.p12`);
    let pdfBuffer = fs.readFileSync(`${__dirname}/../resources/including-a-link.pdf`);
    pdfBuffer = plainAddPlaceholder({
        pdfBuffer,
        reason: 'I have reviewed it.',
        location: 'some city',
        signatureLength: 1612,
    });
    pdfBuffer = signer.sign(pdfBuffer, p12Buffer);

    const {signature, signedData} = extractSignature(pdfBuffer);
    expect(typeof signature === 'string').toBe(true);
    expect(signedData instanceof Buffer).toBe(true);
});

推荐阅读