en ua ru

umcaservice / документація

umcaservice - кросплатформенний криптографічний REST API сервіс на базі сертифікованої ДССЗЗІ бібліотеки CryptoLib для інтеграції криптографії в веб-застосунки.
Наразі доступні дві редакції сервісу:

  • basic - вільна версія сервісу для некомерційного використання. Основний функціонал - постановка вдосконаленого або кваліфікованого електронного підпису
  • full - версія сервісу для комерційного використання. Функціонал - постановка та перевірка вдосконаленого або кваліфікованого ЕП, менеджмент сертифікатів та носіїв ключової інформації, направлене шифрування та розшифрування

Платформи, що підтримуються:
  • Windows 7 (з Service Pack 1), 8, 10, Windows Server 2012, 2016, 2019
  • GNU/Linux (дистрибутиви на основі Debian, також є серверні збірки для CentOS/RHEL)
  • Mac OS X 10.13+
  • iOS 13+
  • Android 7+
Сервіс виконує задачі:
  • Постановки ЕП(чистий підпис або конверти формату CAdES BES, CAdES TS, CAdES Long C, CAdES Long X)
  • Перевірки конвертів ЕП, міток часу та сертифікатів
  • Менеджменту косіїв ключової інформації(генерація та видалення ключів з сертифікатами, оновлення сертифікатів на НКІ, зміна pin-коду)
  • Направленого шифрування та розшифрування даних
НКІ, що підтримуються:
  • Апаратні: пристрої з інтерфейсом PKCS#11
  • Програмні в форматах: Pfx(PKCS#12), JKS (Java Key Store), .DAT(АТ "ІІТ"), .ZS2(АЦСК "Україна")

Використання

За замовчуванням, сервіс має стандартний набір налаштувань і не потребує додаткового налаштування, проте є можливість додаткового налаштування утиліти.

Основні налаштування утиліти записані в файлі конфігурації, якщо він відсутній - утиліта створює його за шляхом %APPDATA%/Avtor/UmCAService/umcago.conf для Windows та $HOME/.umcad/umcago.conf для Linux та Mac OS X. Також доступний веб-конфігуратор сервісу(пункт меню "Конфігурація" в меню утиліти).

В комплекті umcaservice наявні дві бібліотеки PKCS#11 для токенів/смарт-карт ТОВ "АВТОР" моделей CC337 та CC338. Для підтримки інших смарт-карт чи токенів необхідно додати до списку Pkcs11Modules шляхи до бібіліотек PKCS#11 для цих пристроїв.

Приклади застосування API доступні у вигляді колекції Postman.
Також доступний демонстраційний веб-застосунок UmCADemo, що використовує API umcaservice.

Параметри командного рядка утиліти:

  • --text-mode, -t - запустити утиліту в режимі командного рядка замість іконки в системному треї(тільки Linux, Mac OS X)
  • --config path_to_config, -c path_to_config, - вказати власний файл конфігурації
  • --send-crashes, -s - надсилати креш-дампи сервісу на наш сервер обробки, щоб ми змогли усунути проблему
  • --language lang_code, -l lang_code - перевизначити мову інтерфейсу сервісу(доступні значення: uk, en, de, ru, el)
  • --doc, -d - запустити в режимі розробника(в контекстному меню буде пункт, який відкриває документацію)

У випадку, коли сервіс нештатно завершує роботу - система моніторингу формує звіт про помилку при наступному запуску сервісу. Всі звіти зберігаються в папці %APPDATA%/Avtor/UmCAService/ для ОС Windows або $HOME/.umcad/ для Unix-систем з іменами: виду umcago_{час формування}.crash. Сервіс підтримує опцію надсилання звітів про помилки на наш сервер збору креш-дампів, щоб ми мали інформацію для вирішення проблеми. За замовчуванням ця функція відключена. Щоб увімкнути - необхідно запустити сервіс з прапорцем --send-crashes. При цьому трафік між клієнтом та сервером збору креш-дампів захищений за допомогою TLS. Важливо: ніякі інші персональні дані користувача, крім версії сервісу, ОС, архітектури та креш-дампу не збираються і на сервер не передаються.

API

Взаємодія з сервісом відбувається через HHTP API, яке описане на цій сторінці. Кореневий URI API за замовчуванням: https://localhost:25989. При потребі його можна перевизначити через файл конфігурації. Нижче подані схеми API для редакцій basic та full

позначення, що використовуються в документації:
- вказує на наявність методу тільки в full версії сервісу
- вказує на те, що метод використовує коржики(cookie-файли) для збільшення продуктивності
- вказує на те, що метод доступний тільки при локальних викликах(Referer=localhost)
- вказує на необхідність заповнення поля
- вказує на те, що поле має бути base64-рядком при передачі за допомогою multipart/form-data чи application/x-www-form-urlencoded

About

About
Отримати інформацію про сервіс
GET /about
Response
  • application/json
  • AboutResponse Struct
    Name Type Description
    Name string
    Version string
    Edition string
    Author string
    Email string
    AppID string
    OS string
    Arch string

    Certificates

    CreateCertificate
    Створення нового ключа та самопідписаного сертифікату на ключовому носії
    POST /certificates
    Request
  • application/json
  • GenerateCertificateRequest Struct
    Структура запиту генерації нового ключа
    Name Type Description
    Pin string
    KeyRequest KeyRequest Запит ключа
    KeyStore SlotInfo НКІ для генерації ключа
    Response
  • application/json
  • CertificateDescriptorWide Struct
    Розширений дескриптор сертифікату
    Name Type Description
    Base64 string
    Subject map[string]string Словник полів subjectRDN
    Issuer map[string]string Словник полів issuerRDN
    DirectoryAttributes map[string]string Словник розширення "атрибути директорії"
    NotBefore Timestamp Початок дії сертифікату
    NotAfter Timestamp Закінчення дії сертифікату
    Email string Email згідно RFC 822
    CertificateSerialNumber string Серійний номер сертифікату
    KeyUsage KU Використання ключа
    PublicKey string Відкритий ключ
    PublicKeyAlg string Алгоритм відкритого ключа
    KeyLength int Довжина ключа
    CriticalEkus []string Критичні розширені використання ключа
    CertificatePolicies []string Розширення "політики сертифікату"
    SubjectKeyIdentifier string Розширення "ідентифікатор ключа"
    AuthorityKeyIdentifier string Розширення "ідентифікатор ключа видавця"
    SubjectFingerprint string Геш-сума структури subjectRDN
    SelfSigned bool Визначення, чи самопідписаний сертифікат
    AlternativeName map[string][]string Словник розширення "альтернативне ім'я суб'єкта", можливі ключі словника: "IPs", "DNSNames", "URIs", "EmailAddresses" або довільні об'єктні ідентифікатори
    ExtendedKeyUsage ExtendedKeyUsage extended key usage extension
    QcStatements QcStatements qcStatements extension
    DeleteCertificate
    Видалення сертифікату з ключового насія
    DELETE /certificates
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • DeleteCertificateRequest Struct
    Структура запиту на видалення сертифікату
    Name Type Description
    Certificate []byte
    Pin string
    Response
  • application/json
  • GetCertificateStructure
    Отримати структуру сертифікату
    POST /certificates/structure
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • CertificateStructRequest Struct
    Name Type Description
    Certificate []byte
    Response
  • application/json
  • CertificateDescriptor Struct
    Дескриптор сертифікату
    Name Type Description
    Subject map[string]string Словник полів subjectRDN
    Issuer map[string]string Словник полів issuerRDN
    DirectoryAttributes map[string]string Словник розширення "атрибути директорії"
    NotBefore Timestamp Початок дії сертифікату
    NotAfter Timestamp Закінчення дії сертифікату
    Email string Email згідно RFC 822
    CertificateSerialNumber string Серійний номер сертифікату
    KeyUsage KU Використання ключа
    PublicKey string Відкритий ключ
    PublicKeyAlg string Алгоритм відкритого ключа
    KeyLength int Довжина ключа
    CriticalEkus []string Критичні розширені використання ключа
    CertificatePolicies []string Розширення "політики сертифікату"
    SubjectKeyIdentifier string Розширення "ідентифікатор ключа"
    AuthorityKeyIdentifier string Розширення "ідентифікатор ключа видавця"
    SubjectFingerprint string Геш-сума структури subjectRDN
    SelfSigned bool Визначення, чи самопідписаний сертифікат
    AlternativeName map[string][]string Словник розширення "альтернативне ім'я суб'єкта", можливі ключі словника: "IPs", "DNSNames", "URIs", "EmailAddresses" або довільні об'єктні ідентифікатори
    ExtendedKeyUsage ExtendedKeyUsage extended key usage extension
    QcStatements QcStatements qcStatements extension
    GetCertificates
    Отримання списку сертифікатів згідно фільтру
    GET /certificates
    GetCertificatesRequest Struct
    Фільтр для пошуку сертифікатів в НКІ
    Name Type Description
    KsType KsType
    SubjectCN string
    SubjectSerialNumber string
    SelfSigned bool
    SubjectKeyIdentifier string
    SubjectFingerprint string
    KeyUsage string
    CertificateSerialNumber string
    SubjectUid string
    Email string
    IssuerCN string
    IssuerSN string
    Response
  • application/json
  • []CertificateDescriptorWide Array of CertificateDescriptorWide
    UpdateCertificate
    Оновлення сертифікату на ключовому носії або запис ідентифікатору запиту на сертифікат
    PATCH /certificates
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • UpdateCertificateRequest Struct
    Структура запиту оновлення сертифікату
    Name Type Description
    Certificate []byte
    Pin string
    CaRequestID string Ідентифікатор запиту на отримання сертифікату в ЦСК
    Response
  • application/json
  • Config

    DeleteConfig
    Видалити сертифікат з ключем на НКІ
    DELETE /config
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • Response
  • application/json
  • GetConfig
    Отримання файлу конфігурації
    GET /config
    Response
  • application/json
  • UmCAConfig Struct
    Структура конфігурації UmCAService
    Name Type Description
    Port int Порт на якому стартує сервіс
    TLSKeyFile string Шлях до файлу з TLS ключем PKCS#8(формат PEM)
    TLSCertFile string Шлях до файлу з TLS сертифікатом (формат PEM)
    IsLocal bool Прапорець що вказує чи необхідно запускати сервіс в локальному режимі
    WhiteList []string Білий список дозволених сервісів (зірочка '*' - означає не виконувати перевірку Referer)
    CmpServices []string Cписок CMP-сервісів
    TspServices []string Список TSP-сервісів
    FileKeyStores []string Список шляхів до директорій з програмними ключами('%/' - скорочене позначення для знімних носіїв інформації, наприклад Flash-носії)
    ProxySettings ProxySettings Налаштування проксі
    CertificateCacheDir string Шлях до директорії з кешем сертифікатів та СВС
    Pkcs11Modules []string Список PKCS#11 модулів
    TrustedCertificatesDir string Шлях до директорії з довіреними сертифікатами
    IntermediateCertificatesDir string Шлях до директорії з проміжними сертифікатами
    IntermediateCertificatesCmsURL string URL Cms - контейнер з проміжними сертифікатами
    TrustedCertificatesCmsURL string URL Cms - контейнер з довіреними сертифікатами
    Log string Шлях до файлу з логом, або пороженє значення, якщо лог необхідно писати в STDOUT
    LogLevel int Рівень логування: 1 - DEBUG - максимальний рівень (в тому числі наявність запитів логується), 4 - ERRORS - рівень помилок, 5 - OFF - без логування
    SimplifiedMode bool Прапорець, що вказує на запуск сервісу у спрощеному режимі
    UpdateConfig
    Оновлення файлу конфігурації
    POST /config
    Request
  • application/json
  • UmCAConfig Struct
    Структура конфігурації UmCAService
    Name Type Description
    Port int Порт на якому стартує сервіс
    TLSKeyFile string Шлях до файлу з TLS ключем PKCS#8(формат PEM)
    TLSCertFile string Шлях до файлу з TLS сертифікатом (формат PEM)
    IsLocal bool Прапорець що вказує чи необхідно запускати сервіс в локальному режимі
    WhiteList []string Білий список дозволених сервісів (зірочка '*' - означає не виконувати перевірку Referer)
    CmpServices []string Cписок CMP-сервісів
    TspServices []string Список TSP-сервісів
    FileKeyStores []string Список шляхів до директорій з програмними ключами('%/' - скорочене позначення для знімних носіїв інформації, наприклад Flash-носії)
    ProxySettings ProxySettings Налаштування проксі
    CertificateCacheDir string Шлях до директорії з кешем сертифікатів та СВС
    Pkcs11Modules []string Список PKCS#11 модулів
    TrustedCertificatesDir string Шлях до директорії з довіреними сертифікатами
    IntermediateCertificatesDir string Шлях до директорії з проміжними сертифікатами
    IntermediateCertificatesCmsURL string URL Cms - контейнер з проміжними сертифікатами
    TrustedCertificatesCmsURL string URL Cms - контейнер з довіреними сертифікатами
    Log string Шлях до файлу з логом, або пороженє значення, якщо лог необхідно писати в STDOUT
    LogLevel int Рівень логування: 1 - DEBUG - максимальний рівень (в тому числі наявність запитів логується), 4 - ERRORS - рівень помилок, 5 - OFF - без логування
    SimplifiedMode bool Прапорець, що вказує на запуск сервісу у спрощеному режимі
    Response
  • application/json
  • UpdateConfigPartial
    Часткове оновлення конфігурації сервісу
    PATCH /config
    Request
  • application/json
  • UpdateConfRequest Struct
    Структура запиту на часткове оновлення поточної конфігурації сервісу
    Name Type Description
    CmpServices []string
    TspServices []string
    Response
  • application/json
  • Decrypt

    Decrypt
    Розшифрування данних
    POST /decrypt
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • DecryptRequest Struct
    Запит на розшифрування конверту
    Name Type Description
    Data []byte Зашифровані дані, якщо вони не прикріплені до CMS або конкатанація CMS Detached та шифорваних даних(формат .enc)
    Cms []byte CMS Enveloped конверт
    Pin string Пін-код до носія, на якому зберігається ключ отримувача
    Response
  • application/octet-stream
  • Encrypt

    Encrypt
    Шифруваня данних абонентів
    POST /encrypt
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • EncryptRequest Struct
    Структура запиту зашифровування даних
    Name Type Description
    Certificates [][]byte Сертифікати отримувачів
    Data []byte Дані для зашифрування
    AsBlob bool Прапорець, що вказує формат повернення відповіді(octet-stream якщо значення true). Також може бути заданий http-заголовком Accept: application/octet-stream
    EncSchema int Схема виводу ключа шифрування, ключа для направленого шифрування ДСТУ4145, зазвичай 0 або 256 для сумісності
    IDByIssuerSN bool Ідентифікація сертифікату за серійним номером сертифікату та видевцем
    AttachedData bool Прапорець, що вказує чи потрібно прикріпити зашифровані дані до конверту CMS Enveloped
    EncryptionAlgOid string Ідентифікатор алгоритму шифрування
    Response
  • application/octet-stream
  • application/json
  • EncryptedResponse Struct
    Структура результату шифрування; при серіалізації в 'application/octet-stream' значення 'Cms' та 'EncryptedContent' конкатенуються (формат .enc)
    Name Type Description
    Cms []byte
    EncryptedContent []byte

    Envelope

    MakeEnvelope
    Створити підписаний/зашифрований конверт
    POST /envelope/make
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • MakeEnvelopeRequest Struct
    Name Type Description
    Files [][]byte Список файлів, які необхідно вкласти в конверт
    Certificate []byte Сертифікат підписувача (залишити порожнім, якщо підпис не потрібний)
    Pin string Пін-код носія з ключем підписувача
    Recipients [][]byte Список сертифікатів шифрування отримувачів(залишити порожнім, якщо шифрування не потрібне)
    EncryptionAlgOid string oid-ідентифікатор симетричного алгоритму для шифрування
    SigType SignatureDescriptor Дескриптор підпису
    DigestAlgOid string Ідентифікатор алгоритму підпису
    Response
  • application/octet-stream
  • OpenEnvelope
    Відкриття підписаного/зашифрованого конверту
    POST /envelope/open
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • OpenEnvelopeRequest Struct
    Name Type Description
    Data []byte Конверт у форматі AvtorEnvelope, який необхідно відкрити
    Pin string Пін-код носія з ключем для розшифрування
    Certificate []byte Сертифікат шифрування (або порожнє значення для автоматичного його пошуку в сховищі ключів користувача)
    IntendedEku string Очікуване розширене використання ключа. "any" - будь яке розширене використання.
    MustBeTimestamped bool Прапорець, що засвідчує обов'язковість наявності мітки часу в конверті та її перевірки
    ValidateAsCADES bool Прапорець, що вказує на необхідність перевірити конверт за процедурою перевірки CADES-C(X) Long конвертів
    ValidateContentTimeStamp bool Прапорець, що вказує на необхідність перевірки мітки часу на дані
    PreferOCSP bool Прапорець, що вказує на необхідність надавати перевагу сервісу OCSP замість CRL пре перевірці
    Policy string Політика перевірки сертифікатів
     Можливі значення в запиті:
     default - політика за замовчуванням
     stdua - політика STDUA
     qcua - політика QCUA
     czoua - політика сумісності з ЦЗО
    AttachedDataAsResource bool Прапорець, що вказує на необхідність видачі прикріплених даних у вигляді url-посилання на скачування
    GenerateValidationReport bool Прапорець, що вказує на необхідність формування звіту перевірки підпису
    Response
  • application/octet-stream
  • PreOpenEnvelope
    Привідкрити конверт в форматі AvtorEnvelope
    POST /envelope/preopen
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • PreOpenEnvelopeRequest Struct
    Name Type Description
    Data []byte
    Response
  • application/json
  • PreOpenEnvelopeResponse Struct
    Name Type Description
    EnvelopeType int Тип конверту: 1 - підписаний, 2 - зашифрований, 3 - і те і інше
    RecieverKeyStore KeyStoreSlotDescriptor Дескриптор НКІ отримувача конверту

    Keystores

    ChangePin
    Зміна пін-коду на ключовому носії
    PATCH /keystores
    Request
  • application/json
  • ChangePinRequest Struct
    Структура запиту зміни пін-коду
    Name Type Description
    OldPin string Старий пін-код
    NewPin string Повий пін-код
    KeyStore KeyStoreSelector Селектор НКІ
    Response
  • application/json
  • CheckPin
    Перевірка пін-коду на НКІ
    POST /keystores/checkpin
    Request
  • application/json
  • CheckPinRequest Struct
    Cтруктура запиту перевірки пін-коду
    Name Type Description
    Pin string
    KeyStore KeyStoreSelector
    Response
  • application/json
  • GetKeyStores
    Отримати список носіїв ключової інформації
    GET /keystores
    GetKeyStoresRequest Struct
    Структура запиту на отримання списку НКІ
    Name Type Description
    ReadCertificates bool Прапорець, що вказує чи необхідне читання сертифікатів
    EnfoldFileKeyStores bool Прапорець, що вказує чи необхідно прочитати директорії збереження файлових носіїв(налаштування FileKeyStores в конфігурації) замість безпосередньо програмних НКІ
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ (ім'я носія для апаратних, шлях до файлу для програмних)
    Label string Мітка НКІ
    Serial string Серійний номер НКІ (тільки для апаратних)
    SubjectCN string
    SubjectSerialNumber string
    SelfSigned bool
    SubjectKeyIdentifier string
    SubjectFingerprint string
    KeyUsage string
    CertificateSerialNumber string
    SubjectUid string
    Email string
    IssuerCN string
    IssuerSN string
    Response
  • application/json
  • []KeyStoreSlotDescriptor Array of KeyStoreSlotDescriptor
    ImportKeyStore
    Імпортувати файл НКІ до сховища UmCAService
    POST /keystores/import
    Request
  • application/json
  • ImportKeyStoreRequest Struct
    Name Type Description
    Data []byte Файл НКІ, що має бути імпортований
    KeyStore SlotInfo Дескриптор ключового сховища. На даний момент часу підтримуються тільки файлові сховища, тому KeyStore.Description має містити шлях до директорії зберігання ключів, а KeyStore.Hw=true. Також опційно можна вказати ім'я файлу в KeyStore.Label
    Response
  • application/json
  • KeyStoreSlotDescriptor Struct
    Дескриптор НКІ
    Name Type Description
    Certs []CertificateDescriptorWide
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ: ім'я носія для апаратних; шлях до файлу для програмних в структурі KeyStoreSlotDescriptor або шлях до директорії з ключами в контролері CreateCertificate
    Label string Мітка НКІ(ім'я файлу для програмних НКІ в CreateCertificate)
    Serial string Серійний номер НКІ (тільки для апаратних)
    LoadAssociatedCertificates
    Завантажити асоційовані сертифікати (створити додаткові key11.dat-файли за потреби)
    POST /keystores/loadcerts
    Request
  • application/json
  • LoadAssociatedCertificatesRequest Struct
    a structure of request for loading needed certificates
    Name Type Description
    Pin string
    KeyStore SlotInfoRequest
    Response
  • application/json
  • []CertificateDescriptorWide Array of CertificateDescriptorWide
    SelectKeyStore
    Знаходження НКІ за селектором
    POST /keystores/select
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • KeyStoreSelector Struct
    Cелектор носія ключової інформації: для вибору НКІ необхідно задати сертифікат або cms-конверт (зашифрований чи підписаний) або деякі з полів дескриптору НКІ
    Name Type Description
    Certificate []byte Сертифікат для пошуку НКІ, якому він належить
    Cms []byte Зашифрований або підписаний конверт в форматі CMS для пошуку НКІ, що містить сертифікат отримувача або підписувача відповідно
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ (ім'я носія для апаратних, шлях до файлу для програмних)
    Label string Мітка НКІ
    Serial string Серійний номер НКІ (тільки для апаратних)
    Response
  • application/json
  • KeyStoreSlotDescriptor Struct
    Дескриптор НКІ
    Name Type Description
    Certs []CertificateDescriptorWide
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ: ім'я носія для апаратних; шлях до файлу для програмних в структурі KeyStoreSlotDescriptor або шлях до директорії з ключами в контролері CreateCertificate
    Label string Мітка НКІ(ім'я файлу для програмних НКІ в CreateCertificate)
    Serial string Серійний номер НКІ (тільки для апаратних)

    Log

    GetLog
    Отримання файлу з логом (якщо є)
    GET /log
    Response
  • application/json
  • Sign

    CreateMultipleSignatures
    Підписати пакет документів
    POST /sign/multiple
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • MultipleSignaturesRequest Struct
    структура запиту для пакетного підпису
    Name Type Description
    Certificate []byte Сертифікат, що відповідає ключу для ЕЦП або файл з ключем в форматі pfx, dat, zs2, jks
    MultipleData [][]byte масив документів для підпису
    MultipleCms [][]byte список існуючих конвертів підпису для додавання нових підписів
    Pin string Пін-код до НКІ з сертифікатом ЕЦП
    SigType SignatureDescriptor Дескриптор підпису
    DigestAlgOid string Ідентифікатор алгоритму підпису
    Response
  • application/json
  • [][]byte
    CreateSignature
    Підписання документу (новий або існуючий)
    POST /sign
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • SignatureRequest Struct
    Структура запиту на отримання ЕЦП
    Name Type Description
    Certificate []byte Сертифікат, що відповідає ключу для ЕЦП або файл з ключем в форматі pfx, dat, zs2, jks
    Cms []byte Існуючий конверт, який необхідно підписати (або залишити порожнім, якщо необхідно створити новий)
    Data []byte Дані для підпису
    Pin string Пін-код до НКІ з сертифікатом ЕЦП
    AsBlob bool Прапорець, що вказує формат повернення відповіді(octet-stream якщо значення true). Також може бути заданий http-заголовком Accept: application/octet-stream
    AsResource bool Прапорець, що вказує на необхідність створення файлу з підписом в кеші, відповідь має містити посилання на створений ресурс
    SigType SignatureDescriptor Дескриптор підпису
    DigestAlgOid string Ідентифікатор алгоритму підпису
    Response
  • application/octet-stream
  • application/json
  • GetSignatureFile
    Завантажити файл з підписом або прикріплені до конверту дані
    GET /sign/:id
    Response
  • application/octet-stream
  • application/pdf
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document
  • application/x-pkcs7-signature
  • Verify

    Verify
    Перевірка підписаного документу або сертифікат
    POST /verify
    Request
  • application/json
  • multipart/form-data
  • application/x-www-form-urlencoded
  • ValidationRequest Struct
    Структура запиту перевірки cms-конверту або сертифікату
    Name Type Description
    Certificate []byte Сертифікат для перевірки (вказувати, тільки якщо необхідна перевірка лиш сертифікату, а не конверту)
    Data []byte Дані, що підписувались (тільки якщо вони відсутні в конверті)
    Cms []byte CMS-конверт для перевірки(можливо розширений до CADES-C(X) Long)
    IntendedEku string Очікуване розширене використання ключа. "any" - будь яке розширене використання.
    MustBeTimestamped bool Прапорець, що засвідчує обов'язковість наявності мітки часу в конверті та її перевірки
    ValidateAsCADES bool Прапорець, що вказує на необхідність перевірити конверт за процедурою перевірки CADES-C(X) Long конвертів
    ValidateContentTimeStamp bool Прапорець, що вказує на необхідність перевірки мітки часу на дані
    PreferOCSP bool Прапорець, що вказує на необхідність надавати перевагу сервісу OCSP замість CRL пре перевірці
    Policy string Політика перевірки сертифікатів
     Можливі значення в запиті:
     default - політика за замовчуванням
     stdua - політика STDUA
     qcua - політика QCUA
     czoua - політика сумісності з ЦЗО
    AttachedDataAsResource bool Прапорець, що вказує на необхідність видачі прикріплених даних у вигляді url-посилання на скачування
    GenerateValidationReport bool Прапорець, що вказує на необхідність формування звіту перевірки підпису
    Response
  • application/json
  • ValidationResponse Struct
    Name Type Description
    Status string Загальний статус перевірки:
     Ok якщо конверт або сертифікат пройшли валідацію повністю
     Nok якщо конверт пройшов валідацію частково, тобто є проблеми з валідацією окремих сертифікатів підписувачів або міток часу
     текcт помилки якщо конверт не пройшов базовий етап валідації(зіпсований формат, відсутність даних, тощо), якщо перевірявся тільки сертифікат - помилка при валідації сертифікату
    Signers []SignerInfo Масив з інформацією про підписників (тільки при перевірці CMS)
    AttachedData AttachedData Прикріплені до конверту дані(байтовий масив або url)
    ValidationReportURL string Посилання на звіт перевірки підпису

    Data Structures

    KeyRequest Struct
    Запит на ключ та сертифікат
    Name Type Description
    Subject map[string]string Cловник, що відповідає структурі SubjectDN
    DirectoryAttributes map[string]string Cловник, що відповідає розширенню 'атрибути директорії'
    Email string
    KeyUsage KU Використання ключа
    CriticalEkus []string Список критичних розширених використань ключа (застаріле, використовуйте ExtendedKeyUsage)
    ValidityDays int Кількість днів, протягом яких сертифікат вважається дійсним
    ExtendedKeyUsage ExtendedKeyUsage
    SSCDLabels SSCDLabels Мітки генерації ключа на захищений носій ключової інформації
    KeyParams KeyParams Параметри для генерації ключа
    ExtendedKeyUsage Struct
    Name Type Description
    Critical bool
    KeyPurposeIDs []string note: 'Oids' replaced by 'KeyPurposeIDs' in 3.8.1
    SSCDLabels Struct
    Мітки генерації ключа на захищений носій ключової інформації
    Name Type Description
    ExtendedKeyUsageIITStyle bool Extended Key Usage 1.3.6.1.4.1.19398.1.1.8.23 (Avtor Secure Token)
    QcStatementSSCDUkraine bool qcStatement id-etsi-qcs-QcSSCD
    DirectoryAttributeDeviceSerialNumber bool Directory Attribute 1.2.804.2.1.1.1.11.1.4.7.1
    KeyParams Struct
    Cтруктура параметрів ключа
    Name Type Description
    AlgOid string Алгоритм відкритого ключа (його об'єктний ідентифікатор або скорочення), підтримувані наразі алгоритми:
     'rsa' - 1.2.840.113549.1.1.1 (PKCS#1 RSA)
     'dstu4145' - 1.2.804.2.1.1.1.1.3.1.1 (ДСТУ 4145/2002)
     'ecdsa' - 1.2.840.10045.2.1 (X9.62 ECDSA)
    KeyLen int Довжина ключа, обирається автоматично, якщо значення порожнє
    Params []byte Опціональні параметри, зазвичай значення порожнє
    SlotInfo Struct
    Загальна інформація про носій ключової інформації
    Name Type Description
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ: ім'я носія для апаратних; шлях до файлу для програмних в структурі KeyStoreSlotDescriptor або шлях до директорії з ключами в контролері CreateCertificate
    Label string Мітка НКІ(ім'я файлу для програмних НКІ в CreateCertificate)
    Serial string Серійний номер НКІ (тільки для апаратних)
    QcStatements Struct
    Name Type Description
    Critical bool
    QcStatements []QcStatement
    QcStatement Struct
    Name Type Description
    StatementID string
    StatementInfo []byte
    Timestamp Typedef
    Real Type Description
    Time Timestamp - час UTC
    KU Typedef
    Real Type Description
    uint8 KU - використання ключа. В запиті може бути закодоване як символами: s, e, c, так і 1-байтним числом
    's' - цифровий підпис [0xCO]
    'e' - шифрування/ключовий обмін [0x30/0x08]
    'c' - підпис сертифікатів (ЦСК) [0x06]
    KsType Typedef
    Real Type Description
    uint8 KsType - - тип ключового сховища
    0 - всі сховища
    1 - програмні сховища
    2 - апаратні сховища
    CertificateDescriptorWide Struct
    Розширений дескриптор сертифікату
    Name Type Description
    Base64 string
    Subject map[string]string Словник полів subjectRDN
    Issuer map[string]string Словник полів issuerRDN
    DirectoryAttributes map[string]string Словник розширення "атрибути директорії"
    NotBefore Timestamp Початок дії сертифікату
    NotAfter Timestamp Закінчення дії сертифікату
    Email string Email згідно RFC 822
    CertificateSerialNumber string Серійний номер сертифікату
    KeyUsage KU Використання ключа
    PublicKey string Відкритий ключ
    PublicKeyAlg string Алгоритм відкритого ключа
    KeyLength int Довжина ключа
    CriticalEkus []string Критичні розширені використання ключа
    CertificatePolicies []string Розширення "політики сертифікату"
    SubjectKeyIdentifier string Розширення "ідентифікатор ключа"
    AuthorityKeyIdentifier string Розширення "ідентифікатор ключа видавця"
    SubjectFingerprint string Геш-сума структури subjectRDN
    SelfSigned bool Визначення, чи самопідписаний сертифікат
    AlternativeName map[string][]string Словник розширення "альтернативне ім'я суб'єкта", можливі ключі словника: "IPs", "DNSNames", "URIs", "EmailAddresses" або довільні об'єктні ідентифікатори
    ExtendedKeyUsage ExtendedKeyUsage extended key usage extension
    QcStatements QcStatements qcStatements extension
    ProxySettings Struct
    Name Type Description
    Host string
    Port int
    User string
    Password string
    UseSystemProxy bool
    SignatureDescriptor Typedef
    Real Type Description
    int SignatureDescriptor - дескриптор параметрів ЕЦП
    Крім числа дескриптор підпису зручно можна задати рядком у форматі: $type[-attached][-ts][-signtime][-ocsp][-$policy]
    $type - [raw/cms/cades-c/cades-x/crypto-kdc] - тип ЕЦП: raw - чистий підпис, pdf - внутрішній цифровий підпис pdf-файлу, docx - підпис документу openxml office(.docx), cms - конверт в форматі CmsSigned згідно PKCS#7, cades - конверт в форматі CADES C(X) Long, crypto-kdc - ЕЦП в форматі CryptoKDC
    attached - визначає чи прикріпляти дані до конверту
    ts - вказує на необхідність накладання мітки часу
    ts-content - вказує на необхідність накладання мітки часу на дані(зазвичай не потрібно, якщо ставиться звичайна мітка часу)
    signtime - вказує на необхідність включення в конверт часу підпису
    ocsp - вказує на необхідність використовувати відповіді OCSP при формуванні CAdES Long C/X - конвертів
    $policy - [default/stdua/qcua/czoua] політика валідації сертифікатів(вказувати при формуванні CAdES Long C/X - конвертів)
    (* [...] - опційний параметр, $a - позначення рядкової змінної)
    Приклади:
    - формування конверту з прикріпленими даними в форматі CAdES Long X з політикою валідації STDUA і включенням статусів OCSP з включеним часом підпису: cades-x-attached-ts-signtime-ocsp-stdua;
    - звичайний CAdES BES-конверт з не прикріпленими даними: cms.
    KeyStoreSlotDescriptor Struct
    Дескриптор НКІ
    Name Type Description
    Certs []CertificateDescriptorWide
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ: ім'я носія для апаратних; шлях до файлу для програмних в структурі KeyStoreSlotDescriptor або шлях до директорії з ключами в контролері CreateCertificate
    Label string Мітка НКІ(ім'я файлу для програмних НКІ в CreateCertificate)
    Serial string Серійний номер НКІ (тільки для апаратних)
    KeyStoreSelector Struct
    Cелектор носія ключової інформації: для вибору НКІ необхідно задати сертифікат або cms-конверт (зашифрований чи підписаний) або деякі з полів дескриптору НКІ
    Name Type Description
    Certificate []byte Сертифікат для пошуку НКІ, якому він належить
    Cms []byte Зашифрований або підписаний конверт в форматі CMS для пошуку НКІ, що містить сертифікат отримувача або підписувача відповідно
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ (ім'я носія для апаратних, шлях до файлу для програмних)
    Label string Мітка НКІ
    Serial string Серійний номер НКІ (тільки для апаратних)
    SlotInfoRequest Struct
    Фільтр для пошуку НКІ
    Name Type Description
    Hw bool Прапорець, що вказує на тип НКІ(програмний/апаратний)
    Description string Опис НКІ (ім'я носія для апаратних, шлях до файлу для програмних)
    Label string Мітка НКІ
    Serial string Серійний номер НКІ (тільки для апаратних)
    SignerInfo Struct
    Інформація про вілідацію підписника
    Name Type Description
    Certificate CertificateDescriptorWide Дескриптор сертифікату підписувача
    SigningTime Timestamp Мітка часу на підпис
    ContentTimeStamp Timestamp Мітка часу на дані
    ValidationStatus string Статус валідації підписувача:
     Ok якщо все гаразд.
     текст помилки якщо щось пішло не так (не валідна мітка часу, сертифікат або падіння метеориту на сервер OCSP, тощо). Детальніше про статуси валідації можна дізнатись із словникаValidationStatusesMap

    Error Handling

    В ході запитів до API сервіс може реагувати рядом ситуацій. Список http-кодів відповіді та прикладів JSON-структур відповіді сервісу при помилках:
    • 200 (Ok) - запит було успішно оброблено, відповідь сервісу сформована згідно структури відповіді.
    • 400 (Bad Request) - запит було сформовано некоректно, наприклад пошкоджено формат якогось поля, або воно є незаданим. Зазвичай свідчить про помилку програміста.
      Bad Request {
       "Message": "Data is required", // текстове повідомлення про помилку, в даному разі воно каже про відсутність поля 'Data'
       "Reason": "Request" // причина помилки, 'Request' каже про пошкоджений запит
      }
    • 403 (Forbidden) - сервіс не зміг обробити запит, оскільки запит порушує політики безпеки сервісу(відсутність веб-ресурсу в білому списку, відсутність директорії для генерації ключа, що вказана в запиті в файлі конфігурації). В нормальному сценарії використання сервісу - не виникає.
    • 500(Internal Server Error) - сталась помилка прикладного рівня користувача, до прикладу при роботі з бібіліотекою CryptoLib. Детальніше про коди помилок можна дізнатись із словників DsExceptionsMap, KeyStoreExceptionsMap, ValidationStatusesMap
      Internal Server Error {
       "CryptoLibError": {
         "Kind": 2, // тип виключення: 1 - DsException, 2 - KeyStoreException, 3 - ValidationError, -1 - UnknownException
         "Code": 1880096772, // код помилки
         "InnerCode": 0 // внутрішній код помилки, зазвичай 0
       },
       "Message": "KeyStoreException: KSE_INVALID_PASSWORD ", // текстове повідомлення про помилку, в прикладі каже про невірний пін-код
       "Reason": "CryptoLib" // причина помилки, 'CryptoLib' каже про виключення рівня бібліотеки CryptoLib
      }

    Constants

    AlgorithmKeyLengthMap
    map[string]int{
     // ECDSA Brainpool
     "1.3.36.3.3.2.8.1.1.3": 192,
     "1.3.36.3.3.2.8.1.1.5": 224,
     "1.3.36.3.3.2.8.1.1.7": 256,
     "1.3.36.3.3.2.8.1.1.9": 320,
     "1.3.36.3.3.2.8.1.1.11": 384,
     "1.3.36.3.3.2.8.1.1.13": 512,

     // ECDSA Ansip
     "1.3.132.0.30": 160,
     "1.3.132.0.33": 224,
     "1.3.132.0.34": 384,
     "1.3.132.0.35": 521,

     // ECDSA Prime
     "1.2.840.10045.3.1.1": 192,
     "1.2.840.10045.3.1.4": 239,
     "1.2.840.10045.3.1.7": 256,

     // Dstu4145WithGost
     "1.2.804.2.1.1.1.1.3.1.1.2.0": 163,
     "1.2.804.2.1.1.1.1.3.1.1.2.1": 167,
     "1.2.804.2.1.1.1.1.3.1.1.2.2": 173,
     "1.2.804.2.1.1.1.1.3.1.1.2.3": 179,
     "1.2.804.2.1.1.1.1.3.1.1.2.4": 191,
     "1.2.804.2.1.1.1.1.3.1.1.2.5": 233,
     "1.2.804.2.1.1.1.1.3.1.1.2.6": 257,
     "1.2.804.2.1.1.1.1.3.1.1.2.7": 307,
     "1.2.804.2.1.1.1.1.3.1.1.2.8": 367,
     "1.2.804.2.1.1.1.1.3.1.1.2.9": 431,

     "1.2.804.2.1.1.1.1.3.1.2.2.0": 173,
     "1.2.804.2.1.1.1.1.3.1.2.2.1": 179,
     "1.2.804.2.1.1.1.1.3.1.2.2.2": 191,
     "1.2.804.2.1.1.1.1.3.1.2.2.3": 233,
     "1.2.804.2.1.1.1.1.3.1.2.2.4": 431,

     // Dstu4145WithDstu7564
     "1.2.804.2.1.1.1.1.3.6.1.1.2.0": 163,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.1": 167,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.2": 173,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.3": 179,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.4": 191,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.5": 233,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.6": 257,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.7": 307,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.8": 367,
     "1.2.804.2.1.1.1.1.3.6.1.1.2.9": 431,

     "1.2.804.2.1.1.1.1.3.6.1.2.2.0": 173,
     "1.2.804.2.1.1.1.1.3.6.1.2.2.1": 179,
     "1.2.804.2.1.1.1.1.3.6.1.2.2.2": 191,
     "1.2.804.2.1.1.1.1.3.6.1.2.2.3": 233,
     "1.2.804.2.1.1.1.1.3.6.1.2.2.4": 431,
    }
    DigestAlgorithmsMap
    DigestAlgorithmsMap - словник алгоритмів гешування
    map[string]string{
     // National algorithms
     "Gost34311":  "1.2.804.2.1.1.1.1.2.1",
     "Dstu7564(256)": "1.2.804.2.1.1.1.1.2.2.1",
     "Dstu7564(384)": "1.2.804.2.1.1.1.1.2.2.2",
     "Dstu7564(512)": "1.2.804.2.1.1.1.1.2.2.3",

     // International algorithms
     "SHA-1":  "1.3.14.3.2.26",
     "SHA-256": "2.16.840.1.101.3.4.2.1",
     "SHA-384": "2.16.840.1.101.3.4.2.2",
     "SHA-512": "2.16.840.1.101.3.4.2.3",
     "SHA-224": "2.16.840.1.101.3.4.2.4",
     "SHA-3(224)": "2.16.840.1.101.3.4.2.7",
     "SHA-3(256)": "2.16.840.1.101.3.4.2.8",
     "SHA-3(384)": "2.16.840.1.101.3.4.2.9",
     "SHA-3(512)": "2.16.840.1.101.3.4.2.10",
    }
    DsExceptionsMap
    DsExceptionsMap - словник виключень ієрархії DsException
    map[int]string{
     0x70000001: "ERR_INVALID_FUNCTION", // invalid function
     0x70000002: "ERR_INVALID_OPERATION", // invalid operation
     0x70000003: "ERR_INVALID_PARAM",  // invalid parameter
     0x70000004: "ERR_DATA_NOT_FOUND", // data not found
     0x70000005: "ERR_DATA_CORRUPTED", // data is corrupted
     0x70000006: "ERR_ALG_NOT_FOUND",  // the algorithm is not supported
     0x70000100: "ERR_TRANSPORT_STATUS", // code base for network error, error coding: ERR_TRANSPORT_STATUS + HTTP_STATUS
     0x70000800: "ERR_TSP_STATUS",  // code base for TSP service error, error coding: ERR_TSP_STATUS + TSP_STATUS
     -3:   "ERR_IN_OUT",   // input/output error
     -9:   "ERR_CORRUPTED",   // data is corrupted
    }
    EncryptionAlgorithmsMap
    EncryptionAlgorithmsMap - словник алгоритмів шифрування
    map[string]string{
     // National algorithms
     "Gost28147cfb":  "1.2.804.2.1.1.1.1.1.1.3",
     "Dstu7624cfb(256)": "1.2.804.2.1.1.1.1.1.3.3.2",
     "Dstu7624cfb(512)": "1.2.804.2.1.1.1.1.1.3.3.3",
     "Dstu7624cfb(128)": "1.2.804.2.1.1.1.1.1.3.3.1",
     "Dstu7624cbc(128)": "1.2.804.2.1.1.1.1.1.3.5.1",
     "Dstu7624cbc(256)": "1.2.804.2.1.1.1.1.1.3.5.2",
     "Dstu7624cbc(512)": "1.2.804.2.1.1.1.1.1.3.5.3",
     "Dstu7624ofb(128)": "1.2.804.2.1.1.1.1.1.3.6.1",
     "Dstu7624ofb(256)": "1.2.804.2.1.1.1.1.1.3.6.2",
     "Dstu7624ofb(512)": "1.2.804.2.1.1.1.1.1.3.6.3",

     // International algorithms
     "aes128-CBC": "2.16.840.1.101.3.4.1.2",
     "aes128-CFB": "2.16.840.1.101.3.4.1.4",
     "aes192-CBC": "2.16.840.1.101.3.4.1.22",
     "aes192-CFB": "2.16.840.1.101.3.4.1.24",
     "aes256-CBC": "2.16.840.1.101.3.4.1.42",
     "aes256-CFB": "2.16.840.1.101.3.4.1.44",
     "desCBC":  "1.3.14.3.2.7",
     "DES-EDE3-CBC": "1.2.840.113549.3.7",
    }
    KeyStoreExceptionsMap
    KeyStoreExceptionsMap - словник виключень ієрархії KeyStoreException
    map[int]string{
     0x70100001: "KSE_NOT_IMPLEMENTED", // the function is not implemented
     0x70100002: "KSE_DATA_NOT_FOUND", // keystore not found
     0x70100003: "KSE_STORE_GENERAL", // general keystores error, more detailed Cryptoki library level error returns in InnerCode
     0x70100004: "KSE_INVALID_PASSWORD", // wrong PIN
     0x70100005: "KSE_LOGIN_REQUIRED", // login required
     0x70100006: "KSE_STORE_LOCKED",  // keystore is blocked
     0x70100007: "KSE_STORE_NOMEMORY", // not enough memory on keystore
    }
    NameDirAttrToOidMap
    NameX500ToOidMap - словник мнемонік (аліасів) для найрозповсюдженіших об'єктних ідентифікаторі атрибутів директорії. Мнемоніки діють при отриманні інформації в дескрипторі, а також при генерації
    map[string]string{
     "edrpou":  "1.2.804.2.1.1.1.11.1.4.2.1",
     "drfo":  "1.2.804.2.1.1.1.11.1.4.1.1",
     "hwDeviceSN": "1.3.6.1.4.1.27990.2.3.3",
     "grDeviceSN": "1.3.6.1.4.1.27990.2.3.5",
     "CARequestId": "1.3.6.1.4.1.27990.2.6.4",
    }
    NameX500ToOidMap
    NameX500ToOidMap - словник мнемонік (аліасів) для найрозповсюдженіших об'єктних ідентифікаторів імен суб'єкта. Мнемоніки діють при отриманні інформації в дескрипторі, а також при генерації
    map[string]string{
     "CN":   "2.5.4.3",
     "SN":   "2.5.4.4",
     "C":   "2.5.4.6",
     "L":   "2.5.4.7",
     "ST":   "2.5.4.8",
     "O":   "2.5.4.10",
     "OU":   "2.5.4.11",
     "T":   "2.5.4.12",
     "G":   "2.5.4.42",
     "I":   "2.5.4.43",
     "DC":   "0.9.2342.19200300.100.1.25",
     "E":   "1.2.840.113549.1.9.1",
     "STREET":  "2.5.4.9",
     "SERIALNUMBER": "2.5.4.5",
     "uid":   "2.5.4.45",
     "description": "2.5.4.13",
    }
    ValidationStatusesMap
    ValidationStatusesMap - словник статусів перевірки підпису та сертифікату
    map[int]string{
     1: "VFS_INPROGRESS",  // check in process
     2: "VFS_CERT_NOT_FOUND", // certificate not found
     3: "VFS_CERT_USAGE",  // misuse of certificate
     4: "VFS_ALG_NOT_FOUND", // unknown algorithm
     5: "VFS_INVALID",  // signature is invalid
     6: "VFS_BAD_FORMAT",  // damaged envelope format

     0: "CVS_VALID",    // certificate is valid
     -1: "CVS_REVOKED",    // certificate is revoked
     -2: "CVS_NOT_EFFECTIVE",  // certificate is expired
     -3: "CVS_CRL_NOT_EFFECTIVE", // certificate revocation list is expired
     -4: "CVS_BROKEN",    // the certificate is damaged
     -5: "CVS_CRL_BROKEN",   // certificate revocation list is damaged
     -6: "CVS_VIOLATE_POLICY",  // the certificate violates the application policy
     -7: "CVS_CRL_VIOLATE_POLICY", // certificate revocation list violates the application policy
     -8: "CVS_UNKNOWN_CA",   // unknown CA
     -9: "CVS_UNKNOWN_CRL",   // unknown certificate revocation list
     -10: "CVS_UNREFERENCED_CA",  // a missing link to the certificate from chain during checking the envelope in CADES(C)X Long format
     -12: "CVS_VIOLATE_USAGE",  // certificate violates the application
     -13: "CVS_STORAGE_ERROR",  // storage error
     -14: "CVS_OCSP_TRANSPORT_ERROR", // network error during working with OCSP
     -15: "CVS_OCSP_CERT_ERROR",  // OCSP certificate has not been validated
     -16: "CVS_OCSP_BROKEN",   // OCSP response is corrupted
     -17: "CVS_OCSP_DIFFERENT_TIME", // OCSP response is outdated
     -18: "CVS_ALG_NOT_SUPPORTED", // the algorithm is not supported
     -19: "CVS_OCSP_CERT_CA_ERROR", // certificate validation error that is parent to the OCSP certificate
    }