Кваліфікований Електронний Підпис
Кваліфікований Електронний Підпис, або Кваліфіклована Електронна Печатка --- це набір стандартів криптографічного захисту ДСТУ 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