Использование функции X509ValidateCertificate для проверки регистрационного свидетельства C# (продолжение)

Здравствуйте!

Ранее задавал вопрос по поводу функции X509ValidateCertificate: (Использование функции X509ValidateCertificate для проверки регистрационного свидетельства C#). Получил ответ, что функция X509ValidateCertificate может использоваться только для проверки пунктов 1, 2 и 5 из Правил проверки подлинности электронной цифровой подписи (https://adilet.zan.kz/rus/docs/V1500012864).

Ниже приведу пример нашего кода для проверки этих трёх пунктов:
public int certValidateFlags, certExportFlags;
uint err;
string errStr;
password = “пароль от ключа”;
path = “путь до ключа”;
KalkanCOM.LoadKeyStore((int)KalkanCryptCOMLib.KALKANCRYPTCOM_STORETYPE.KCST_PKCS12, password, path, “test”);
string outCert = “”;
KalkanCOM.X509ExportCertificateFromStore("", (int)certExportFlags, out outCert);
int validType = (int)KalkanCryptCOMLib.KALKANCRYPTCOM_VALIDTYPE.KC_USE_OCSP;
string validPath = “http://ocsp.pki.gov.kz/”;
DateTime tmpD = new DateTime();
string outInfo = “”, getOCSP_resp = “”;
KalkanCOM.X509ValidateCertificate(outCert, validType, validPath, tmpD, out outInfo, certValidateFlags, out getOCSP_resp);
err = KalkanCOM.GetLastError(out errStr);
if (err == 0)
{
//выполнение скрипта после удачных проверок
}

Используем настоящий ключ, срок которого действителен. Установили корневой и промежуточный сертификаты в хранилище сертификатов Windows с сайта https://pki.gov.kz/ . Подключение к сети установлено. Следовательно, проверка цепочки, проверки сроков действия и проверка отозванности будут выполнены успешно.

Вопрос следующий. Мы прочитали в документации, что если err = 0, значит ошибок найдено не было, поэтому решили, что можно просто написать условие по проверке значения err, равного нулю. То есть после вызова метода X509ValidateCertificate получаем значение err, и если оно равно нулю, то значит проверка цепочки, проверки сроков действия и проверка отозванности были выполнены успешно. Пробовали удалять сертификаты, чтобы нельзя было построить цепочку, отключаться от сети, чтобы нельзя было проверить на отозванность, использовали просроченные сертификаты. Во всех этих случаях условие на равенство err нулю не выполнялось. При использовании действительного ключа, с установленными корневым и промежуточным сертификатами и с подключением к сети условие выполнялось, err был равен нулю. Вопрос такой: достаточно ли нашего кода выше, чтобы считать проверку пунктов 1, 2 и 5 из Правил проверки подлинности электронной цифровой подписи успешными?

Добрый день!
Метод X509ValidateCertificate() осуществляет проверку построения цепочки до корневого сертификата, проверки сроков действия всех сертификатов и проверка на статус отозванности сертификата.
В случае если одна из проверок не выполнится, то библиотека запишет ошибку. Чтобы вывести эту ошибку необходимо выполнить метод GetLastError() или GetLastErrorString().
Если err = 0; значит ошибок было не найдено и метод X509ValidateCertificate() выполнился без ошибок.

1 Симпатия

Спасибо за Ваш ответ!