Добрый день.
Спасибо, за Ваш ответ.
Попробовал собрать нашу библиотеку под Ubuntu (ubuntu-18.04-desktop-amd64). Установил версию CSP 4.0 (64-биная 4.0.9944-5 - поставил все, что предложил "install_gui.sh"). Установил контейнеры приватных ключей и сертификаты к ним + сертификат УЦ (тот еще квест). Вроде как, заработало. Формирует подписи и проверяет для сертификатов трех типов (ГОСТ-2001 / ГОСТ-2012-256 / ГОСТ-2012-512).
Но есть две проблемы:
1. Функция "CertVerifyCertificateChainPolicy" не желает работать с параметром "CPCERT_CHAIN_POLICY_SIGNATURE" - возвращает FALSE и "GetLastError" выдает ошибку 0x57 (ERROR_INVALID_PARAMETER - "The parameter is incorrect"?). Вот фрагмент кода, который проверяет сертификат перед подписью (он работает под Windows без проблем):
...
CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_PARA extraPolicyPara = {0};
extraPolicyPara.cbSize = sizeof(CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_PARA);
extraPolicyPara.pPrivateKeyUsedTime = (FILETIME *) NULL;
CERT_CHAIN_POLICY_PARA chainPolicyPara = {0};
chainPolicyPara.cbSize = sizeof(CERT_CHAIN_POLICY_PARA);
chainPolicyPara.dwFlags = 0;
chainPolicyPara.pvExtraPolicyPara = (void *) &extraPolicyPara;
CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS extra_policy_status = {0};
extra_policy_status.cbSize = sizeof(extra_policy_status);
CERT_CHAIN_POLICY_STATUS chainPolicyStatus = {0};
chainPolicyStatus.cbSize = sizeof(CERT_CHAIN_POLICY_STATUS);
chainPolicyStatus.pvExtraPolicyStatus = (void *) &extra_policy_status;
BOOL ret = CertVerifyCertificateChainPolicy(CPCERT_CHAIN_POLICY_SIGNATURE, p_chain_context, &chainPolicyPara, &chainPolicyStatus);
if (ret == FALSE) {
printf("===ps1:%x\n", GetLastError());
...
2. Совсем забавно, но функция "CryptBinaryToStringA" не желает работать с параметром "CRYPT_STRING_NOCRLF". То есть, с "CRYPT_STRING_BASE64" она отрабатывает нормально, а вот с комбинацией "CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF" уже нет. Возвращает FALSE и "GetLastError" выдает ошибку 0x57 (ERROR_INVALID_PARAMETER - "The parameter is incorrect"?).
Можете прокомментировать? Вдруг я что-то не так делаю...
С уважением, Константин Ткачук.
P.S. Если в пункте № 1 указать параметр "CPCERT_CHAIN_POLICY_PRIVATEKEY_USAGE_PERIOD", то все отрабатывает без ошибок. Какой из двух вариантов значения параметра правильнее указывать для дальнейшей сертификации ПО в ФСБ? Просто, не я занимался изначальной разработкой библиотеки - и, вроде как, первая версия со значением параметра "CPCERT_CHAIN_POLICY_SIGNATURE" сертификацию под Windows прошла. Теперь вот делаем доработки для ГОСТ-2012.
Отредактировано пользователем 2 мая 2018 г. 13:35:37(UTC)
| Причина: Не указана