Подписание pdf-документа с помощью шифрования в nodejs

#node.js #cryptography #multer

#node.js #криптография #мультер

Вопрос:

Я отправляю из интерфейса один PDF-файл и правильно сохраняю его на стороне nodejs благодаря Multer.

У меня есть одна функция с этим контентом:

 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 (например)

Любая помощь с этим кодом, он не выдает ошибок, но он не работает..

Спасибо!

Ответ №1:

Этот код создает простую подпись 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);
});
 

Комментарии:

1. Хорошо, я пытался работать с этим модулем, но он не распознает функцию подписи. С другой стороны, как вы думаете, это ответственность стороннего интерфейса или серверной части?

2. Создание подписи и внедрение в PDF-файл, безусловно, является серверной задачей. Поскольку весь процесс подписания PDF-файлов — довольно серьезное мероприятие, я мог бы помочь при более глубоком изучении проекта. Вы можете связаться со мной, используя электронную почту в моем профиле.