Документація · Віджети

Перевірка підпису

Віджет verify виконує повну валідацію підпису: криптографія, ланцюжок сертифікатів, OCSP/CRL-статуси, мітки часу. Ключ і пароль не потрібні — це безсекретний віджет (у ньому фізично немає коду роботи з ключами).

Мінімальний приклад

import { embed } from 'https://dstucrypt.io/embed/dstucrypt-embed.mjs';

const verifier = await embed('verify', {
    mount: '#verify-box',          //  зручно вбудувати панеллю, не модалкою
});

const report = await verifier.verify(p7sFile);
if (report.valid) console.log('Підпис дійсний', report.signers);

API

const report = await verifier.verify(signature, data?);
  • signature — файл/байти підпису (.p7s, .pdf, .xml, .asics, .asice). Формат визначається автоматично — CMS, PDF, XML чи ASiC.
  • data — оригінальні дані; потрібні лише для відокремленого (detached) підпису.

Результат

{
  valid: true,                //  сумарний вердикт
  signers: [{                 //  по одному на кожного підписанта
    status: 'TOTAL-VALID',    //  TOTAL-VALID | TOTAL-FAILED | INDETERMINATE
    valid: true,
    statusSignature: 'VALID',        //  криптографічна перевірка підпису
    statusMessageDigest: 'VALID',    //  цілісність даних
    accredited: true,         //  true — від акредитованого АЦСК (це КЕП); false — ні; null — не перевірено
    format: 'CAdES-T',
    signingTime: '2026-07-30 12:00:00',
    timestampTime: '2026-07-30 12:00:02',  //  мітка часу, якщо є
    ocspStatus: 'GOOD',       //  статус сертифіката за OCSP (якщо перевірявся)
    crlStatus: undefined,     //  або за CRL
    signerCertId: '…',
    signerName: 'Іваненко Іван Іванович',  //  ПІБ/назва з сертифіката (CN)
    signerOrg: 'ТОВ «Приклад»',            //  організація (O), якщо відрізняється
    signerCode: '1234567890',              //  РНОКПП/ЄДРПОУ (serialNumber)
  }],
  content: Bytes | null,      //  вкладені дані (для attached-підпису)
}

content — обгортка Bytes (.bytes, .text(), .download()); дозволяє одразу показати чи зберегти документ, вкладений у підпис.

accredited показує, чи це КЕП: сертифікат підписанта простежено до офіційного кореня ЦЗО (акредитований АЦСК). false — підпис дійсний, але без статусу КЕП; null — акредитацію не перевіряли.

Рекомендація для критичних рішень

Віджет чесно перевіряє підпис у браузері — цього достатньо для UX (показати користувачу вердикт). Але якщо на підставі перевірки ви приймаєте рішення на бекенді (зарахувати платіж, прийняти документ) — не довіряйте вердикту, що прийшов із браузера клієнта: браузер контролює користувач. Передайте сам підпис на свій бекенд і перевірте його там — для цього ми даємо готовий серверний API (нижче). Для входу за КЕП є окремий готовий потік — див. Вхід за КЕП.

Серверна перевірка (для бекенда)

Авторитетна перевірка на нашому сервері нативним криптоядром: криптографія + ланцюжок до акредитованого АЦСК + OCSP/CRL + мітка часу. Використовуйте для критичних рішень (зарахувати платіж, прийняти документ) — на відміну від браузерної перевірки, тут результат не контролює клієнт.

curl -X POST https://dstucrypt.com.ua/api/verify \
  -H "Content-Type: application/json" \
  -d '{ "signature": "<base64 .p7s/.pdf/.xml/.asice>" }'
  • { "signature": "<base64>" } — підпис (формат визначається автоматично);
  • { "signature": "<base64>", "content": "<base64>" } — для detached-підпису (окремі оригінальні дані);
  • { "cert": "<base64>" } — перевірити один сертифікат (акредитація + OCSP).

Відповідь:

{
  "ok": true,                       // усі підписи криптографічно дійсні
  "signers": [{
    "status": "TOTAL-VALID",
    "signatureValid": true,         // криптографія підпису
    "digestValid": true,            // цілісність даних
    "accredited": true,             // сертифікат від акредитованого АЦСК
    "qualified": true,              // це КЕП (accredited + дійсний)
    "revocation": "GOOD",           // OCSP/CRL: GOOD | REVOKED | UNKNOWN
    "signatureFormat": "CAdES-T",
    "signingTime": "2026-07-30 12:00:00",
    "timestampTime": "2026-07-30 12:00:02",
    "subject": {
      "fullName": "Іваненко Іван Іванович",
      "taxId": "1234567890",        // РНОКПП
      "orgCode": "12345678",        // ЄДРПОУ
      "issuer": "АЦСК …",
      "certSerial": "…", "validFrom": "…", "validTo": "…"
    }
  }],
  "content": "<base64 вкладеного вмісту, якщо attached>"
}

Для режиму { "cert": … } відповідь: { ok, accredited, qualified, revocation, subject }.