node.js - 在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 中显示为已签名(例如)
对此代码的任何帮助都不会引发错误,但它不起作用..
谢谢!
解决方案
此代码创建简单的 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 文件中,那么您应该在使用 Adobe 打开时看到数字签名。
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);
});
推荐阅读
- python - 如何使用网格权重方法在 Tkinter 中同样扩展图像按钮?
- flutter - Flutter 中 lib(dart) 文件夹的风格,如 Android 中的 src 文件夹
- git - Git 操作在网络共享上超级慢
- sql - SQL Server 中日期的第一条和最后一条记录
- typescript - VSCode IntelliSense 建议在我输入“反应式”时弹出。虽然列表中有一些成员,但“反应式”不在
- android - 如何使用不同服务器上的多个数据库的数据创建新数据库
- json - 上传没有引用对象的 STIX 对象
- javascript - 如果放在 .js 中,则无法调用 javascript 函数
- c# - 如何在运行时显示调整大小的句柄?
- oracle - Obiee 代理以不同格式发送交付内容以用于不同用途