Кваліфікований Електронний Підпис

Кваліфікований Електронний Підпис, або Кваліфіклована Електронна Печатка --- це набір стандартів криптографічного захисту ДСТУ 4145, та міжнародних стандартів які визначають його конверт: X.501, X.509, X.511, X.520.

Серія міжнародних стандартів X.500, групується по категоріям, кожна з яких має свій перелік ASN.1 файлів. Аби підключити усі визначення необхідні для КЕП використані наступі компоненти стандартів (виділені болдом): X.501 --- BasicAccessControl, InformationFramework, UsefulDefinitions; X.509 --- SpkmGssTokens, PkiPmiExternalDataTypes, AttributeCertificateDefinitions, AlgorithmObjectIdentifiers, AuthenticationFramework, CertificateExtensions; X.511 --- SpkmGssTokens, DirectoryAbstractService, X.520 --- PasswordPolicy, UpperBounds, SelectedAttributeTypes. Можно було би винести необхідні визначення одразу в KEP.asn1, однак цим хотілося підкреслити сумісність з міжнародними стандартами. Окрім серії протоколів X.500, КЕП ще визначає також запити та відповіді OCSP, також у ASN.1 форматі.

На відміну від самого алгоритму КЕП, який визначено ДСТУ 4145, конверти визначаються не стандартами, а наказами міністерства юстиції: Проект наказу Адміністрації Держспецзв'язку та Держкомінфоматизації (2009), Наказ Міністерства юстиції України 1236/5/453. Керуючись цими нормативними документами було створено файл KEP.asn1, який є одним з трьох top-level файлів необхідниї для компіляції ASN.1 компілятором.

Існує небагато безкоштовних та повних компіляторів (генераторів парсерів) ASN.1 специфікацій. Erlang є прикладом системи, до складу якої входить першокласний безкоштовний з відкритою ліценцією ASN.1 компілятор, де файли в ASN.1 нотації можуть бути зкомпільовані безпосередньо Erlang компілятором:

$ erlc AuthenticationFramework.asn1 $ erlc InformationFramework.asn1 $ erlc KEP.asn1

Створити файл підпису PKCS-7 можна за допомогою будь якої програми сертифікованої в Україні. Найпростіше отримати свою КЕП печатку будучи клієнтом ПриватБанку. За допомогою "Користувача ЦСК" компанії ІІТ ви можете підписувати файли використовуючи безкоштовну форму приватного ключа у вигляді звичайного файлу.

Щоб показати як користуватися КЕП, та прочитати атрибутивну інформацію з сертифікату, який вшитий в PCKS-7 повідомлення з криптографічним підписом, покажемо 5 функцій:

Record.defrecord(:certAttrs, serial: "", cn: "", givenName: "", surname: "", o: "", title: "", ou: "", c: "", locality: "") def extract(code, person) do case :lists.keyfind(code, 2, person) do false -> "" {_, _, {:printable, str}} -> str {_, _, {:utf8, str}} -> str end end def parseSignData(bin) do {_, {:ContentInfo, _, ci}} = :KEP.decode(:ContentInfo, bin) {:ok, {:SignedData, _, alg, x, c, x1, x2}} = :KEP.decode(:SignedData, ci) parseSignDataCert({alg,x,c,x1,x2}) end def parseSignDataCert({_,_,:asn1_NOVALUE,_,_}), do: [] def parseSignDataCert({_,_,[cert],_,_}), do: parseCert(cert) def parseCert(cert) do {:Certificate, a, _, _} = cert {:Certificate_toBeSigned, _, _, _, issuer, _, issuee, _, _, _, _} = a person = :lists.flatten(:erlang.element(2, issuee)) ca = :lists.flatten(:erlang.element(2, issuer)) {parseAttrs(person),parseAttrs(ca)} end def parseAttrs(attrs) do certAttrs( o: extract({2, 5, 4, 10}, attrs), ou: extract({2, 5, 4, 11}, attrs), title: extract({2, 5, 4, 12}, attrs), cn: extract({2, 5, 4, 3}, attrs), givenName: extract({2, 5, 4, 42}, attrs), surname: extract({2, 5, 4, 4}, attrs), locality: extract({2, 5, 4, 7}, attrs), serial: extract({2, 5, 4, 5}, attrs), c: extract({2, 5, 4, 6}, attrs) ) end

У результаті отримуємо наступний високорівневий інтерфейс:

> {:ok,bin} = :file.read_file("priv/5HT.p7s") > KEP.parseSignData bin {{:certAttrs, "1786046", "СОХАЦЬКИЙ МАКСИМ ЕРОТЕЙОВИЧ", "МАКСИМ ЕРОТЕЙОВИЧ", "СОХАЦЬКИЙ", "СОХАЦЬКИЙ МАКСИМ ЕРОТЕЙОВИЧ", "Електронна печатка", "", 'UA', "КИЇВ"}, {:certAttrs, "UA-14360570-2018", "АЦСК АТ КБ «ПРИВАТБАНК»", "", "", "АКЦІОНЕРНЕ ТОВАРИСТВО КОМЕРЦІЙНИЙ БАНК «ПРИВАТБАНК»", "", "АЦСК", 'UA', "Київ"}}

Даний код можна знайти як частину нашої synrc/ca бібліотеки: 🛡️ CA: Certificate Authority — ca.erp.uno