Как указано в документе:
Правила проверки электронной цифровой подписи и регистрационного свидетельства пользователей Национального удостоверяющего центра Республики Казахстан
Дабы подтвердить действительность ЭЦП необходимо провести 7 видов проверок (6 обязательных + 1 необязательная)
На данном этапе я смог разобраться с некоторыми проверками, но все еще остаются непонятые моменты. Хотел бы изложить методы которые я использую при каждой проверке.
Использую библиотеку CC(Kalkan) (C#)
Проверка 1. Проверка подписи
Я подписываю XML данные на стороне клиента и отправляю их на сервер для проверки. Для проверки подписи использую метод
verifyXMLbytes
Пример из SDK с методом
signverifyXMLstring() возвращает почему то всегда -1 (ошибка)
byte[] xmlBytesOut = xmlEx.signXMLbytes(xmlBytesIn, "..\\..\\pkcs12\\gost_deist.p12", "123456", ""); ;
if (xmlBytesOut.Length > 0)
{
string xmlSigned = Encoding.UTF8.GetString(xmlBytesOut);
Console.WriteLine("signXMLbytes SUCCESS.");
Console.WriteLine(xmlSigned);
}
//verifyXMLbytes return int (0 - signature is BAD; 1 - signature is OK; -1 - error)
string[] sCertCA = new string[2];
sCertCA[0] = "..\\..\\ca_cert\\knca_root.cer";
sCertCA[1] = "..\\..\\ca_cert\\rca_gost.cer";
res = xmlEx.verifyXMLbytes(xmlBytesOut, sCertCA);
if (res == 1)
{
Console.WriteLine("verifyXMLbytes SUCCESS.");
}
Есть ли пример для проверки подписи подписанные сертификатами выданные НУЦ 1.0 и НУЦ 2.0 ?
Проверка 2. Проверка цепочки сертификатов
Во первых проверяю срок годности сертификатов КУЦ и НУЦ, а после проверяю цепочку сертификатов
Для проверки цепочки сертификатов GOST использую следующее:
[new_NCA_GOST.cer] > [new_NCA_GOST.cer] > [сертификат пользователя] - для старых сертификатов выданных НУЦ 1.0
[root_gost.cer] > [pki_gost.cer](находится в SDK) > [сертификат пользователя] - для новых тестовых сертификатов выданных НУЦ 2.0
[root_gost.cer] > [pki_gost.cer](с сайта pki.gov.kz) > [сертификат пользователя] - для новых боевых сертификатов выданных НУЦ 2.0
Проверка 3. Проверка срока действия регистрационного свидетельства
Для проверки срока проверяю NotAfter и NotBefore относительно времени на сервере
Проверка 4. Проверка по OCSP или CRL (BASE + DELTA)
Сначала проверяю через OCSP, если сервис не доступен то по CRL(проверка сроков годности CRL'ov а потом по CRL'am)
BIO bcertca_oldNCA = BIO.File(@"...\ca_cert\НУЦ 1.0\NCA_GOST.der", "rb");
X509Certificate certca_oldNCA = X509Certificate.FromDER(bcertca_oldNCA);
int res = cert.CheckOCSP(certca_oldNCA, "http://ocsp.pki.gov.kz/");
if (res == 0)
{
Console.WriteLine("certificate is good.");
return true;
}
BIO bcertca_newNCA = BIO.File(@"...\ca_cert\НУЦ 2.0\new_NCA_GOST.der", "rb");
X509Certificate certca_newNCA = X509Certificate.FromDER(bcertca_newNCA);
res = cert.CheckOCSP(certca_newNCA, "http://ocsp.pki.gov.kz/");
if (res == 0)
{
Console.WriteLine("certificate is good.");
return true;
}
if (res > 1)
{
Console.WriteLine("certificate is revoked.");
return false;
}
В случае если, провала обоих методов, то пользователь будет уведомлен, что сервис временно не доступен
Проверка 5. Проверка штампа времени
Не проверяю, тк. не требуется
Проверка 6. Проверка параметров формата
Вместо JAVA мы используем NCALayer.
Могу ли я ссылаться на то что при выборе контейнера ключей я указываю, что
getKeys(storageAlias, storagePath, password, [b]"SIGN"[/b], "callback");
- достаточно ли этого, или нужны еще дополнительные проверки?
Проверка 7. Проверка DN имени регистрационного свидетельства
DN имеется в виду subjectDN? "ИС должна осуществлять проверку идентификационных данных владельца регистрационного свидетельства подписывающей стороны". Имеется в виду что нужно проверять эти данные в случае если пользователь подписал данные случайно не тем ключом (если их у него несколько). Правильно ли я понял?