#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-файлов — довольно серьезное мероприятие, я мог бы помочь при более глубоком изучении проекта. Вы можете связаться со мной, используя электронную почту в моем профиле.