Функция cryptgetkeyparam вернула ошибку

Форум КриптоПро
 » 
Устаревшие продукты
 » 
КриптоПро CSP 3.6
 » 
Не удается получить сертификат из контейнера Linux


Offline

Серёня

 


#1
Оставлено
:

6 марта 2014 г. 12:50:34(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Здравствуйте.
Мне необходимо написать программу, с помощью которой пользователи будут подписывать некий документ своей ЭЦП. Соответственно пользователь, подписывающий документ, не один и у каждого из них будет съемный носитель с контейнером ключей.
Платформа — Linux. CSP версии v3.6.5365 КС2 Release Ver:3.6.7777. Опыта работы с CSP нет.

Сейчас я пытаюсь получить сертификат из контейнера ключей со съемного носителя для всех доступных контейнеров, делаю вот так

Код:

// Получаем дескриптор криптопровайдера
HCRYPTPROV hProv = 0;
if(!CryptAcquireContext(&hProv, NULL, NULL, CSP_PROV_TYPE, CRYPT_VERIFYCONTEXT)) {
    HandleError("CryptAcquireContext failed");
}

DWORD fParam = CRYPT_FIRST;
DWORD cnt = 0;
DWORD size = 1000;
BYTE ContName[1000];
BYTE* pbCertBlob = 0;
DWORD dwCertBlob = 0;
PCCERT_CONTEXT certificate = 0;

// Перебираем все доступные контейнеры
while (CryptGetProvParam(hProv, PP_ENUMCONTAINERS, ContName, &size, fParam)) {
    printf("Container name: %sn", (char*) ContName);
    fParam = CRYPT_NEXT;
    cnt++;
    HCRYPTKEY hKey;
    HCRYPTPROV hProv2;
    char* name = new char[size];
    strcpy(name, (char*) ContName);
    printf("name: %sn", name);

    // Получаем дескриптор контейнера
    // Вот тут, кстати, вопрос. Если использовать hProv для которого указано CRYPT_VERIFYCONTEXT,
    // то CryptGetUserKey не находи ключи, возвращает 0x8009000d
    // Поэтому получаем новый дескриптор провайдера.
    // Так и надо, или я что-то делаю не так?
    CryptAcquireContext(&hProv2, name, NULL, CSP_PROV_TYPE, NULL);

    // Получение дескриптора открытого ключа
    if (CryptGetUserKey(hProv2, CSP_KEY_TYPE, &hKey)) {
        printf("CryptGetUserKey success! Type: CSP_KEY_TYPE: %dn", CSP_KEY_TYPE);

        // Получение сертификата ключа из контейнера
        // Сначала получаем размер
//////Вот тут возникает ошибка 0x8010002c			
        if (CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwCertBlob, NULL)) {
            if (pbCertBlob = new BYTE[dwCertBlob]) {

                // теперь сам сертификат
                if (CryptGetKeyParam(hKey, KP_CERTIFICATE, pbCertBlob, &dwCertBlob, NULL)) {
                    printf("CryptGetKeyParam success!n");
                    CRYPT_KEY_PROV_INFO key;
                    //key.pwszContainerName = name;
                    //key.pwszProvName = CSP_PROV_NAME;
                    key.dwProvType = CSP_PROV_TYPE;
                    key.dwFlags = NULL;
                    key.cProvParam = NULL;
                    key.rgProvParam = NULL;
                    key.dwKeySpec = CSP_KEY_TYPE;
                    if (certificate = CertCreateCertificateContext(
                            PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
                            pbCertBlob,
                            dwCertBlob)) {							
                    } else {
                        printf("CertCreateCertificateContext failed!.n");
                        DWORD err = GetLastError();
                        printf("Error number     : 0x%xn", err);
                    }
                } else {
                    printf("CryptGetKeyParam 2 failed!n");
                }
            } else {
                printf("pbCertBlob = new BYTE[dwCertBlob]    - failed!n");
            }
        } else {
        printf("CryptGetKeyParam 1 failed!n");
                DWORD err = GetLastError();
                printf("Error number     : 0x%xn", err);
            }
    } else {
        printf("CryptGetUserKey failed. Type: CSP_KEY_TYPE: %dn", CSP_KEY_TYPE);
        DWORD err = GetLastError();
        printf("Error number     : 0x%xn", err);
    }
    delete[] name;
}

Вобщем вопрос, что это за ошибка 0x801002c и что я делаю не так?


Вверх

Offline

Василий Дементьев

 


#2
Оставлено
:

6 марта 2014 г. 13:25:35(UTC)

Василий Дементьев

Статус: Администратор

Группы: Администраторы, Участники
Зарегистрирован: 28.12.2007(UTC)
Сообщений: 348
Откуда: ООО "КРИПТО-ПРО"

Поблагодарили: 5 раз в 4 постах

Ошибка 0x8010002C означает «Требуемый сертификат не существует».
Т.е. в контейнере нет сертификата.
Это нормальная ситуация — сертификат не всегда устанавливают в ключевой контейнер.


Вверх

WWW


Offline

Серёня

 


#3
Оставлено
:

6 марта 2014 г. 15:11:20(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Правильно ли я понимаю, что без сертификата не получится получить закрытый ключ электронной подписи? Или все-таки это возможно?


Вверх

Offline

Юрий

 


#4
Оставлено
:

6 марта 2014 г. 15:49:46(UTC)

Юрий

Статус: Активный участник

Группы: Участники

Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах

Автор: Серёня Перейти к цитате

Правильно ли я понимаю, что без сертификата не получится получить закрытый ключ электронной подписи? Или все-таки это возможно?

Сертификаты и ключи связаны очень искуственно. Это разные сущности.
Так что да, без сертификата можно получить закрытый ключ.

С уважением,
Юрий Строжевский


Вверх

WWW


Offline

Серёня

 


#5
Оставлено
:

6 марта 2014 г. 16:05:40(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Ну тогда вопрос напрашивается сам собой. Как получить закрытый ключ из контейнера без сертификата?
Сей час воспользовался тестовым УЦ (https://www.cryptopro.ru/certsrv/) и мой пример заработал. Но в таком случае не хотелось бы привязываться к сертификату, если есть такая возможность.


Вверх

Offline

Юрий

 


#6
Оставлено
:

6 марта 2014 г. 16:17:26(UTC)

Юрий

Статус: Активный участник

Группы: Участники

Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах

Автор: Серёня Перейти к цитате

Ну тогда вопрос напрашивается сам собой. Как получить закрытый ключ из контейнера без сертификата?
Сей час воспользовался тестовым УЦ (https://www.cryptopro.ru/certsrv/) и мой пример заработал. Но в таком случае не хотелось бы привязываться к сертификату, если есть такая возможность.

По-правильному «получение закрытого ключа» называется «экспорт». Так что смотрите стандартные примеры по экспорту ключей во внешние контейнеры.

С уважением,
Юрий Строжевский


Вверх

WWW


Offline

Серёня

 


#7
Оставлено
:

6 марта 2014 г. 16:41:37(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Когда я формировал ключи в тестовом СЦ, там была галочка «Пометить ключ как экспортируемый». Правильно ли я понял, если ее не поставить, то экспортировать ключ не удастся?


Вверх

Offline

Юрий

 


#8
Оставлено
:

6 марта 2014 г. 16:46:30(UTC)

Юрий

Статус: Активный участник

Группы: Участники

Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах

Да, правильно.
Однако посмотрев первый пост я думаю, что скорее всего вам нужна функция «CryptAcquireContext».

С уважением,
Юрий Строжевский


Вверх

WWW

thanks 1 пользователь поблагодарил Юрий за этот пост.

Серёня

оставлено 11.03.2014(UTC)

Пользователи, просматривающие эту тему

Guest

Форум КриптоПро
 » 
Устаревшие продукты
 » 
КриптоПро CSP 3.6
 » 
Не удается получить сертификат из контейнера Linux

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Форум КриптоПро
 » 
Устаревшие продукты
 » 
КриптоПро CSP 3.6
 » 
Не удается получить сертификат из контейнера Linux


Offline

Серёня

 


#1
Оставлено
:

6 марта 2014 г. 12:50:34(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Здравствуйте.
Мне необходимо написать программу, с помощью которой пользователи будут подписывать некий документ своей ЭЦП. Соответственно пользователь, подписывающий документ, не один и у каждого из них будет съемный носитель с контейнером ключей.
Платформа — Linux. CSP версии v3.6.5365 КС2 Release Ver:3.6.7777. Опыта работы с CSP нет.

Сейчас я пытаюсь получить сертификат из контейнера ключей со съемного носителя для всех доступных контейнеров, делаю вот так

Код:

// Получаем дескриптор криптопровайдера
HCRYPTPROV hProv = 0;
if(!CryptAcquireContext(&hProv, NULL, NULL, CSP_PROV_TYPE, CRYPT_VERIFYCONTEXT)) {
    HandleError("CryptAcquireContext failed");
}

DWORD fParam = CRYPT_FIRST;
DWORD cnt = 0;
DWORD size = 1000;
BYTE ContName[1000];
BYTE* pbCertBlob = 0;
DWORD dwCertBlob = 0;
PCCERT_CONTEXT certificate = 0;

// Перебираем все доступные контейнеры
while (CryptGetProvParam(hProv, PP_ENUMCONTAINERS, ContName, &size, fParam)) {
    printf("Container name: %sn", (char*) ContName);
    fParam = CRYPT_NEXT;
    cnt++;
    HCRYPTKEY hKey;
    HCRYPTPROV hProv2;
    char* name = new char[size];
    strcpy(name, (char*) ContName);
    printf("name: %sn", name);

    // Получаем дескриптор контейнера
    // Вот тут, кстати, вопрос. Если использовать hProv для которого указано CRYPT_VERIFYCONTEXT,
    // то CryptGetUserKey не находи ключи, возвращает 0x8009000d
    // Поэтому получаем новый дескриптор провайдера.
    // Так и надо, или я что-то делаю не так?
    CryptAcquireContext(&hProv2, name, NULL, CSP_PROV_TYPE, NULL);

    // Получение дескриптора открытого ключа
    if (CryptGetUserKey(hProv2, CSP_KEY_TYPE, &hKey)) {
        printf("CryptGetUserKey success! Type: CSP_KEY_TYPE: %dn", CSP_KEY_TYPE);

        // Получение сертификата ключа из контейнера
        // Сначала получаем размер
//////Вот тут возникает ошибка 0x8010002c			
        if (CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwCertBlob, NULL)) {
            if (pbCertBlob = new BYTE[dwCertBlob]) {

                // теперь сам сертификат
                if (CryptGetKeyParam(hKey, KP_CERTIFICATE, pbCertBlob, &dwCertBlob, NULL)) {
                    printf("CryptGetKeyParam success!n");
                    CRYPT_KEY_PROV_INFO key;
                    //key.pwszContainerName = name;
                    //key.pwszProvName = CSP_PROV_NAME;
                    key.dwProvType = CSP_PROV_TYPE;
                    key.dwFlags = NULL;
                    key.cProvParam = NULL;
                    key.rgProvParam = NULL;
                    key.dwKeySpec = CSP_KEY_TYPE;
                    if (certificate = CertCreateCertificateContext(
                            PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
                            pbCertBlob,
                            dwCertBlob)) {							
                    } else {
                        printf("CertCreateCertificateContext failed!.n");
                        DWORD err = GetLastError();
                        printf("Error number     : 0x%xn", err);
                    }
                } else {
                    printf("CryptGetKeyParam 2 failed!n");
                }
            } else {
                printf("pbCertBlob = new BYTE[dwCertBlob]    - failed!n");
            }
        } else {
        printf("CryptGetKeyParam 1 failed!n");
                DWORD err = GetLastError();
                printf("Error number     : 0x%xn", err);
            }
    } else {
        printf("CryptGetUserKey failed. Type: CSP_KEY_TYPE: %dn", CSP_KEY_TYPE);
        DWORD err = GetLastError();
        printf("Error number     : 0x%xn", err);
    }
    delete[] name;
}

Вобщем вопрос, что это за ошибка 0x801002c и что я делаю не так?


Вверх

Offline

Василий Дементьев

 


#2
Оставлено
:

6 марта 2014 г. 13:25:35(UTC)

Василий Дементьев

Статус: Администратор

Группы: Администраторы, Участники
Зарегистрирован: 28.12.2007(UTC)
Сообщений: 348
Откуда: ООО "КРИПТО-ПРО"

Поблагодарили: 5 раз в 4 постах

Ошибка 0x8010002C означает «Требуемый сертификат не существует».
Т.е. в контейнере нет сертификата.
Это нормальная ситуация — сертификат не всегда устанавливают в ключевой контейнер.


Вверх

WWW


Offline

Серёня

 


#3
Оставлено
:

6 марта 2014 г. 15:11:20(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Правильно ли я понимаю, что без сертификата не получится получить закрытый ключ электронной подписи? Или все-таки это возможно?


Вверх

Offline

Юрий

 


#4
Оставлено
:

6 марта 2014 г. 15:49:46(UTC)

Юрий

Статус: Активный участник

Группы: Участники

Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах

Автор: Серёня Перейти к цитате

Правильно ли я понимаю, что без сертификата не получится получить закрытый ключ электронной подписи? Или все-таки это возможно?

Сертификаты и ключи связаны очень искуственно. Это разные сущности.
Так что да, без сертификата можно получить закрытый ключ.

С уважением,
Юрий Строжевский


Вверх

WWW


Offline

Серёня

 


#5
Оставлено
:

6 марта 2014 г. 16:05:40(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Ну тогда вопрос напрашивается сам собой. Как получить закрытый ключ из контейнера без сертификата?
Сей час воспользовался тестовым УЦ (https://www.cryptopro.ru/certsrv/) и мой пример заработал. Но в таком случае не хотелось бы привязываться к сертификату, если есть такая возможность.


Вверх

Offline

Юрий

 


#6
Оставлено
:

6 марта 2014 г. 16:17:26(UTC)

Юрий

Статус: Активный участник

Группы: Участники

Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах

Автор: Серёня Перейти к цитате

Ну тогда вопрос напрашивается сам собой. Как получить закрытый ключ из контейнера без сертификата?
Сей час воспользовался тестовым УЦ (https://www.cryptopro.ru/certsrv/) и мой пример заработал. Но в таком случае не хотелось бы привязываться к сертификату, если есть такая возможность.

По-правильному «получение закрытого ключа» называется «экспорт». Так что смотрите стандартные примеры по экспорту ключей во внешние контейнеры.

С уважением,
Юрий Строжевский


Вверх

WWW


Offline

Серёня

 


#7
Оставлено
:

6 марта 2014 г. 16:41:37(UTC)

Серёня

Статус: Участник

Группы: Участники

Зарегистрирован: 03.03.2014(UTC)
Сообщений: 22
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 2 раз

Когда я формировал ключи в тестовом СЦ, там была галочка «Пометить ключ как экспортируемый». Правильно ли я понял, если ее не поставить, то экспортировать ключ не удастся?


Вверх

Offline

Юрий

 


#8
Оставлено
:

6 марта 2014 г. 16:46:30(UTC)

Юрий

Статус: Активный участник

Группы: Участники

Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах

Да, правильно.
Однако посмотрев первый пост я думаю, что скорее всего вам нужна функция «CryptAcquireContext».

С уважением,
Юрий Строжевский


Вверх

WWW

thanks 1 пользователь поблагодарил Юрий за этот пост.

Серёня

оставлено 11.03.2014(UTC)

Пользователи, просматривающие эту тему

Guest

Форум КриптоПро
 » 
Устаревшие продукты
 » 
КриптоПро CSP 3.6
 » 
Не удается получить сертификат из контейнера Linux

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Hi, I was advised to create an issue here after I created an Intune ticket in the Microsoft Q&A forums (https://docs.microsoft.com/en-us/answers/questions/70809/0x8010002c-request-certificate-does-not-exist-duri.html)

I am trying to integrate a Third-party CA to work with Intune SCEP to issue certificates according to https://docs.microsoft.com/en-us/mem/intune/protect/scep-libraries-apis. I am using the CsrValidation api for Java to integrate.

My issue is not really with the CsrValidation API.

I have setup the following Configuration profiles in Azure Endpoint manager:
Trusted Certificate: Computer store — Root (Root CA)
Trusted Certificate: Computer store — Intermediate (Root CA)
Trusted Certificate: Computer store — Intermediate (Intermediate CA)
SCEP Certificate: Windows 10.

All 3 Trusted Certificate Profiles are successfully deployed to the WIN10 device.
device_status_root_store
device_status_inter_store

To enrol the Windows 10 Device I go to ‘Settings -> Account -> Access work or school -> Connect’. The Windows UI says that the connection is successful.

However, when looking in the Windows 10 Event Viewer under ‘Applications and Services Logs/Microsoft/Windows/DeviceManagement-Enterprise-Diagnostics-Provider’ it gives the following two errors:

Event 307: SCEP: Failed LogError Message : (SCEPInstallCertificateWithScepHelper:Failed to Initialize SCEP enrollment with NDES Server ‘http://{url}/scep/intune/pkiclient.exe’, CA cert thumbprint ‘2FCF40…CEF1’ and server )

Event 32: SCEP: Certificate enroll failed. Result: (The requested certificate does not exist.). [HRESULT: 0x8010002c]

These 2 errors occurs after the ‘GetCACertChain’ call has been made from the WIN10 device and the CA SCEP RA has returned the chain in PKCS#7 format containing the Root CA, Intermediate CA and the RA certificate.

The thumbprint in Event 307 is the same as the thumbprint of my Root CA.

Any ideas on what I have misconfigured to get this error?

Hi, I was advised to create an issue here after I created an Intune ticket in the Microsoft Q&A forums (https://docs.microsoft.com/en-us/answers/questions/70809/0x8010002c-request-certificate-does-not-exist-duri.html)

I am trying to integrate a Third-party CA to work with Intune SCEP to issue certificates according to https://docs.microsoft.com/en-us/mem/intune/protect/scep-libraries-apis. I am using the CsrValidation api for Java to integrate.

My issue is not really with the CsrValidation API.

I have setup the following Configuration profiles in Azure Endpoint manager:
Trusted Certificate: Computer store — Root (Root CA)
Trusted Certificate: Computer store — Intermediate (Root CA)
Trusted Certificate: Computer store — Intermediate (Intermediate CA)
SCEP Certificate: Windows 10.

All 3 Trusted Certificate Profiles are successfully deployed to the WIN10 device.
device_status_root_store
device_status_inter_store

To enrol the Windows 10 Device I go to ‘Settings -> Account -> Access work or school -> Connect’. The Windows UI says that the connection is successful.

However, when looking in the Windows 10 Event Viewer under ‘Applications and Services Logs/Microsoft/Windows/DeviceManagement-Enterprise-Diagnostics-Provider’ it gives the following two errors:

Event 307: SCEP: Failed LogError Message : (SCEPInstallCertificateWithScepHelper:Failed to Initialize SCEP enrollment with NDES Server ‘http://{url}/scep/intune/pkiclient.exe’, CA cert thumbprint ‘2FCF40…CEF1’ and server )

Event 32: SCEP: Certificate enroll failed. Result: (The requested certificate does not exist.). [HRESULT: 0x8010002c]

These 2 errors occurs after the ‘GetCACertChain’ call has been made from the WIN10 device and the CA SCEP RA has returned the chain in PKCS#7 format containing the Root CA, Intermediate CA and the RA certificate.

The thumbprint in Event 307 is the same as the thumbprint of my Root CA.

Any ideas on what I have misconfigured to get this error?


Offline

Arzybek

 


#1
Оставлено
:

4 марта 2022 г. 10:19:10(UTC)

Arzybek

Статус: Участник

Группы: Участники

Зарегистрирован: 04.03.2022(UTC)
Сообщений: 11
Российская Федерация

Приветствую. Впервые работаю с вашими продуктами. Появились вопросы по тому, как корректно установить КриптоПро CSP на Linux (Ubuntu 20 LTS). Что пробовал:
1. По этому гайду (https://tcrypt.ru/Content/Instruction/linux_plugin.html) установить 4 версию. Но, как я понял, она идет без ГУИ, тестовая страница показывала, что все вроде работает, но при попытке установки корневого сертификата сыпались какие-то ошибки, поэтому решил установить последнюю версию, чтобы исключить вариант устаревших версий.
2. По этому гайду (https://support.cryptopro.ru/index.php?/Knowledgebase/Article/View/390/10/rbot-s-kriptopro-csp-v-linux) установил последнюю на данный момент (5.какая-то) версию. Все делал по гайду: запустил гуи установку, установил доп. программное обеспечение, установил плагин. Тестовая страница опять же показывает, что все вроде работает. Появилась Гуи, через нее импортировал корневой сертификат, который предлагает тестовая страница, вроде добавилось. Попробовал также сделать тестовый сертификат на тестовой странице, он его увидел и даже дал что-то подписать. В ГУИ видно тестовый контейнер и сертификат собственно. Но при дальнейшей попытке загрузить свой сертификат .cer через Гуи он их отправляет в «личное» и соответственно потом их не видно, на той же тестовой странице. Как мне сейчас создать правильно контейнер (на жестком диске, без флешек, вроде такое возможно) и загрузить туда .cer файл? Пробовал с этого гайда (https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=11300) начиная со слов «Добавление хранилища на жёстком диске» выполнил:

Цитата:

sudo /opt/cprocsp/sbin/amd64/cpconfig -hardware reader -add HDIMAGE store
/opt/cprocsp/bin/amd64/csptest -keyset -newkeyset -cont ‘.HDIMAGEmain’ -provtype 75 -provider «Crypto-Pro GOST R 34.10-2001 KC1 CSP»

ГУИ вроде видит после этого контейнер, тип ключа пишет «подписи», а не «обмена», в отличие от тестового сертификата. Но дальше выдает ошибку:

Цитата:

/opt/cprocsp/bin/amd64/cryptcp -creatrqst -dn «E=email, C=RU, CN=localhost, SN=company» -nokeygen -both -ku -cont ‘.HDIMAGEmain’ main.req
CryptCP 5.0 (c) «КРИПТО-ПРО», 2002-2021.
Утилита командной строки для подписи и шифрования файлов.
Ошибка: Идентификатор объекта имеет неправильный формат.

../../../../CSPbuild/CSP/samples/CPCrypt/Enroll.cpp:655: 0x80091003
[ErrorCode: 0x80091003]

И так, мои 2 вопроса:

  1. По актуальному ли гайду я установил КриптоПро CSP или нужно было по первому варианту?
  2. Как мне сейчас добавить свой .cer файл, чтобы та же тестовая страница его видела?

P.S: я разработчик, мне это необходимо в целях разработки, не для входа на какие-нибудь госуслуги и т.п., если это на что-то влияет. Заранее спасибо за ответ.

Отредактировано пользователем 4 марта 2022 г. 10:24:35(UTC)
 | Причина: Не указана


Вверх

Offline

nickm

 


#2
Оставлено
:

4 марта 2022 г. 11:09:33(UTC)

nickm

Статус: Активный участник

Группы: Участники

Зарегистрирован: 31.05.2016(UTC)
Сообщений: 766

Сказал(а) «Спасибо»: 232 раз
Поблагодарили: 126 раз в 116 постах

1. Да, инструкция базы помощи «КриптоПро» актуальная;

2. Тестовый Удостоверяющий Центр ООО «КРИПТО-ПРО»

Цитата:

Добро пожаловать на сайт тестового Удостоверяющего Центра ООО «КРИПТО-ПРО»
Вы можете использовать тестовый центр сертификации для того, чтобы получить сертификат ключа проверки электронной подписи (сертификат открытого ключа).
Для получения сертификата вы должны будете сформировать закрытый и открытый ключи и ввести данные, которые используются для связывания открытого ключа и владельца сертификата.


Вверх

Offline

Arzybek

 


#3
Оставлено
:

4 марта 2022 г. 11:18:40(UTC)

Arzybek

Статус: Участник

Группы: Участники

Зарегистрирован: 04.03.2022(UTC)
Сообщений: 11
Российская Федерация

Автор: nickm Перейти к цитате

1. Да, инструкция базы помощи «КриптоПро» актуальная;

2. Тестовый Удостоверяющий Центр ООО «КРИПТО-ПРО»

Цитата:

Добро пожаловать на сайт тестового Удостоверяющего Центра ООО «КРИПТО-ПРО»
Вы можете использовать тестовый центр сертификации для того, чтобы получить сертификат ключа проверки электронной подписи (сертификат открытого ключа).
Для получения сертификата вы должны будете сформировать закрытый и открытый ключи и ввести данные, которые используются для связывания открытого ключа и владельца сертификата.

Так, и что мне с этим делать? Второй пункт с этой страницы я делал, именно так и получил .cer файл, он уже есть, что дальше с этим делать?

Отредактировано пользователем 4 марта 2022 г. 11:21:23(UTC)
 | Причина: Не указана


Вверх

Offline

nickm

 


#4
Оставлено
:

4 марта 2022 г. 11:28:41(UTC)

nickm

Статус: Активный участник

Группы: Участники

Зарегистрирован: 31.05.2016(UTC)
Сообщений: 766

Сказал(а) «Спасибо»: 232 раз
Поблагодарили: 126 раз в 116 постах

Установить его в системе с привязкой к ключевому контейнеру, который должен у Вас находиться в одном из возможном хранилище.


Вверх

Offline

Arzybek

 


#5
Оставлено
:

4 марта 2022 г. 11:32:53(UTC)

Arzybek

Статус: Участник

Группы: Участники

Зарегистрирован: 04.03.2022(UTC)
Сообщений: 11
Российская Федерация

Автор: nickm Перейти к цитате

Установить его в системе с привязкой к ключевому контейнеру, который должен у Вас находиться в одном из возможном хранилище.

Как это сделать? В этом и заключается вопрос, можно инструкцию?


Вверх

Offline

nickm

 


#6
Оставлено
:

4 марта 2022 г. 13:03:59(UTC)

nickm

Статус: Активный участник

Группы: Участники

Зарегистрирован: 31.05.2016(UTC)
Сообщений: 766

Сказал(а) «Спасибо»: 232 раз
Поблагодарили: 126 раз в 116 постах

Для начала следует убедиться, что у Вас вообще имеются какие-нибудь контейнеры в хранилищах.
Например, таким образом.


Вверх

Offline

Arzybek

 


#7
Оставлено
:

4 марта 2022 г. 13:09:57(UTC)

Arzybek

Статус: Участник

Группы: Участники

Зарегистрирован: 04.03.2022(UTC)
Сообщений: 11
Российская Федерация

Автор: nickm Перейти к цитате

Для начала следует убедиться, что у Вас вообще имеются какие-нибудь контейнеры в хранилищах.
Например, таким образом.

Ну да, вот он видит тот, который я создал, собственно говоря, сверху описанным способом, что дальше?


Вверх

Offline

nickm

 


#8
Оставлено
:

4 марта 2022 г. 13:25:04(UTC)

nickm

Статус: Активный участник

Группы: Участники

Зарегистрирован: 31.05.2016(UTC)
Сообщений: 766

Сказал(а) «Спасибо»: 232 раз
Поблагодарили: 126 раз в 116 постах

Автор: Arzybek Перейти к цитате

получил .cer файл, он уже есть, что дальше с этим делать?

Автор: Arzybek Перейти к цитате

Код:

$ /путь_до_утилиты_КриптоПро/certmgr -inst -file /путь_до_сертификата/cert.cer -store uMy -cont '.HDIMAGEmain'

Все эти команды, кстати, в теме по указанной Вами же ссылке присутствуют.

Отредактировано пользователем 4 марта 2022 г. 13:27:18(UTC)
 | Причина: Не указана


Вверх

Offline

Arzybek

 


#9
Оставлено
:

4 марта 2022 г. 13:32:10(UTC)

Arzybek

Статус: Участник

Группы: Участники

Зарегистрирован: 04.03.2022(UTC)
Сообщений: 11
Российская Федерация

Автор: nickm Перейти к цитате

Автор: Arzybek Перейти к цитате

получил .cer файл, он уже есть, что дальше с этим делать?

Автор: Arzybek Перейти к цитате

Код:

$ /путь_до_утилиты_КриптоПро/certmgr -inst -file /путь_до_сертификата/cert.cer -store uMy -cont '.HDIMAGEmain'

Все эти команды, кстати, в теме по указанной Вами же ссылке присутствуют.

Так вот я и говорю, что не срабатывает, пишет:

Цитата:

Не удалось установить сертификат
Открытые ключи в сертификате и контейнере не совпадают

Требуемый сертификат не существует.

[ErrorCode: 0x8010002c]

Может я что-то не так делаю, в каком порядке и что нужно выполнить на том сайте, и затем локально?

Отредактировано пользователем 4 марта 2022 г. 13:32:44(UTC)
 | Причина: Не указана


Вверх

Offline

nickm

 


#10
Оставлено
:

4 марта 2022 г. 13:46:38(UTC)

nickm

Статус: Активный участник

Группы: Участники

Зарегистрирован: 31.05.2016(UTC)
Сообщений: 766

Сказал(а) «Спасибо»: 232 раз
Поблагодарили: 126 раз в 116 постах

Автор: Arzybek Перейти к цитате

Может я что-то не так делаю, в каком порядке и что нужно выполнить на том сайте, и затем локально?

То, что следует сделать локально — Вы сейчас прошли по шагам.
То что Вы делаете на сайте — это только Вам и известно.

Ошибка вполне читаемая:

Цитата:

Не удалось установить сертификат
Открытые ключи в сертификате и контейнере не совпадают

Требуемый сертификат не существует.
[ErrorCode: 0x8010002c]


Вверх
Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

УСТАНОВКА И ЗАПУСК АРМ ЗАКАЗЧИК

Перед установкой рабочего места Заказчика на компьютер необходимо установить программу MS .NET Framework 4.0 (можно скачать на портале государственных закупок Алтайского края в разделе «Поддержка/Программы»), а также программу криптографической защиты информации КриптоПро CSP. Установить программу КриптоПро CSP нужно именно той версии, лицензия на которую выдана в Удостоверяющем центре. Также, если ключ ЭП выдан на специальном носителе (eToken, ruToken и пр.), необходимо установить соответствующие драйвера для этих устройств.

Установка и настройка программного обеспечения выполняется пользователем самостоятельно.

2.1. Установка АРМ Заказчика

Если программа АРМ Заказчика была установлена ранее на другом компьютере, достаточно скопировать папку с программой на новый компьютер.

Для полной установки АРМ Заказчика на компьютер пользователя, необходимо скачать установочный файл программы (можно скачать на портале государственных закупок Алтайского края в разделе «Поддержка/Программы»

http://www.gzalt.ru/Folder/Folder.aspx?FP=86 ).

После скачивания программу необходимо установить. Для этого запустите скачанный установочный файл и в появившемся окне нажмите кнопку «Далее».

Рисунок 3 – Мастер установки программы АРМ Заказчик

Выбрать компоненты для установки (в случае если MS .NET Framework не установлен).

Рисунок 4 – Выбор компонентов

Выбрать путь установки программы или оставить по умолчанию.

Рисунок 5 – Выбор пути установки

У нажать кнопку «Установить».

Рисунок 6 – Процесс установки

В случае успешной установки программы по завершении установки появится соответствующее сообщение.

Рисунок 7 – Завершение установки

2.2. Настройки программы

Открыть окно настройки АРМ Оператора можно при запуске программы при помощи кнопки «Настройки».

Рисунок 8 – Кнопка Настройки окна запуска

Другой способ изменения настроек АРМ Заказчика: из уже запущенной программы при помощи меню «Сервис/Настройки программы».

Рисунок 9 – Выбор настроек через меню программы

В разделе «Общие настройки» окна настроек задается период проверки сообщений (по умолчанию – раз в 30 минут).

Рисунок 10 – Общие настройки

В разделе «Транспортная система» задается Идентификатор пользователя (совпадает с серийным номером сертификата пользователя). При смене сертификата пользователя, необходимо сменить и идентификатор, либо поставить флажок «Автоматически назначать идентификатор по ЭЦП». Также здесь можно задать период ожидания ответа от сервера (по умолчанию 60 секунд).

Рисунок 11 – Настройки транспортной системы

В разделе «Шифрование» задается тип криптосистемы и имя контейнера. Если необходимо перенастроить программу на работу с другим ключевым контейнером, нажмите кнопку «Выбрать» напротив строки «Имя контейнера» и выберите соответствующий ключевой контейнер. Если поставить галку «Выбирать контейнер при запуске», программа будет каждый раз при запуске отображать окно выбора ключевого контейнера.

Рисунок 12 – Настройки системы шифрования

Если при экспорте сертификата возникает ошибка «Требуемый сертификат не существует», значит, в контейнере ключа отсутствует открытая часть.

Рисунок 13 – Ошибка «Требуемый сертификат не существует»

В этом случае при установке сертификата ЭП необходимо добавить сертификат в контейнер (рисунок 14).

Рисунок 14 – Установка сертификата в контейнер в КриптоПро CSP

В разделе «Всплывающие сообщения» можно включить или отключить сообщения (рисунок ).

Рисунок 15 – Включение/отключение всплывающих сообщений

В случае если выход в Интернет осуществляется через прокси-сервер, необходимо задать его параметры в разделе «Прокси-сервер».

В настройках прокси-сервера указать параметры прокси-сервера (адрес, порт, имя пользователя и пароль).

Рисунок 16– Параметры прокси-сервера

Если установлена галка «Использовать системные настройки», программа будет использовать настройки прокси-сервера из настроек Internet Explorer.

Рисунок 17 – Установка галки «Использовать системные настройки»

Для фиксации сделанных изменений в настройках программы нужно нажать кнопку «Сохранить» в нижней части окна.

Примечание.

Убедитесь, что межсетевые экраны (брандмауэры, файерволы) имеют разрешительные правила на пропуск трафика из/на сервер государственных закупок Алтайского края (соответствующие адреса с портами прописаны в файле host.xml в папке с программой).

2.3. Запуск программы

Запустить программу АРМ Заказчика можно либо посредством ярлыка на рабочем столе, либо через меню «Пуск/Все программы/АИС Госзаказ». Ключевой носитель при этом должен быть вставлен в компьютер.

Появится окно выбора сервера, в котором нажмите кнопку «Подключиться».

Рисунок 18 – Окно запуска программы

После прохождения этапа инициализации программа, возможно, обновит свои файлы, после чего появится главное окно программы.

Если появилось окно с сообщением об ошибке, представленной на рисунке 13, то необходимо добавить сертификат в контейнер (Рисунок 14).

Если при входе в систему программа выдаст сообщение, представленное на рисунке 19. Необходимо повторно запустить АРМ.

Рисунок 19 – Окно запуска программы

Аватара пользователя

rozen

Сообщения: 169
Зарегистрирован: 25 мар 2015, 12:11
Имя: Андрей
Откуда: Красноярск

Re: КриптоПро расширение для PHP 7

Расширение заработало, но при добавлении сертификата 502 Bad Gateway
В логах сервера:

Код: Выделить всё

2020/10/28 08:58:22 [error] 1067#1067: *4188 recv() failed (104: Connection reset by peer) while reading response header from upstream, 
client: 10.89.*.*, server: cto.krw.rzd, request: "POST /rukovoditel/index.php?module=users/signature_account&action=update HTTP/2.0", 
upstream: "fastcgi://unix:/var/run/php/php7.4-fpm.sock:", host: "cto.krw.rzd", 
referrer: "https://cto.krw.rzd/rukovoditel/index.php?module=users/signature_update"

Проверка настройки показывает: test init OK
Сертификаты добавлены.

В системных логах такое:

Код: Выделить всё

Oct 29 10:03:44 10 ool www: <capi10>CryptEnumOIDInfo!failed: LastError = 0xEA
Oct 29 10:03:44 10 ool www: <capi10>CryptVerifySignatureW!failed: LastError = 0x80090006
Oct 29 10:03:44 10 ool www: <capi20>CryptVerifyCertificateSignature!failed: LastError = 0x80090006
Oct 29 10:03:44 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:44 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:49 10 ool www: <capi10>CryptEnumOIDInfo!failed: LastError = 0xEA
Oct 29 10:03:49 10 ool www: <capi10>CryptVerifySignatureW!failed: LastError = 0x80090006
Oct 29 10:03:49 10 ool www: <capi20>CryptVerifyCertificateSignature!failed: LastError = 0x80090006
Oct 29 10:03:49 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:49 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2

Решил проверить хранилище сертификатов: с нем пусто.
Но добавление проходит без ошибок. Вот только куда? :shock:

Код: Выделить всё

 /opt/cprocsp/bin/amd64/certmgr -list
Certmgr 1.1 (c) "КРИПТО-ПРО", 2007-2020.
Программа для работы с сертификатами, CRL и хранилищами.
=============================================================================
Список сертификатов пуст

Требуемый сертификат не существует.

Аватара пользователя

rozen

Сообщения: 169
Зарегистрирован: 25 мар 2015, 12:11
Имя: Андрей
Откуда: Красноярск

Re: КриптоПро расширение для PHP 7

Сообщение

rozen » 30 окт 2020, 04:06

Сейчас так: сертификатов больше. Показал один.

Код: Выделить всё

sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot
[sudo] password for rozen:
Certmgr 1.1 (c) "КРИПТО-ПРО", 2007-2020.
Программа для работы с сертификатами, CRL и хранилищами.
=============================================================================
1-------
Издатель            : E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь России, OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Субъект             : E=uc@mil.ru, OGRN=1037700255284, INN=007704252261, C=RU, S=77 г. Москва, L=Москва, STREET="ул. Знаменка, д. 19", OU=4 центр (удостоверяющий) войсковой части 31659, O=Министерство обороны Российской Федерации, CN=Министерство обороны Российской Федерации
Серийный номер      : 0x3252B37400000000044E
Хэш SHA1            : 1e4977c9cad2358853391267d4e5d47e4ca7ba6f
Идентификатор ключа : 650b083aa72a8dc7a6449682b97df99d6b8e2aa8
Алгоритм подписи    : ГОСТ Р 34.11-2012/34.10-2012 256 бит
Алгоритм откр. кл.  : ГОСТ Р 34.10-2012 (512 бит)
Выдан               : 31/07/2020  11:15:02 UTC
Истекает            : 31/07/2035  11:15:02 UTC
Ссылка на ключ      : Нет
URL сертификата УЦ  : http://reestr-pki.ru/cdp/guc_gost12.crt
URL списка отзыва   : http://reestr-pki.ru/cdp/guc_gost12.crl
URL списка отзыва   : http://company.rt.ru/cdp/guc_gost12.crl
URL списка отзыва   : http://rostelecom.ru/cdp/guc_gost12.crl

Что не работает — не понимаю. Либо модуль сбоит, но проверку проходит. Либо … либо.
Кстати, тест от КриптоПро не проходит.

Код: Выделить всё

Cannot find object or property. (0x80092004)TEST FAIL 

Код: Выделить всё

PHP Fatal error:  Uncaught Error: Class 'CPStore' not found 

Аватара пользователя

rozen

Сообщения: 169
Зарегистрирован: 25 мар 2015, 12:11
Имя: Андрей
Откуда: Красноярск

Re: КриптоПро расширение для PHP 7

Сообщение

rozen » 30 окт 2020, 07:22

Выполнение через командную строку кода:

Код: Выделить всё

<?php
ini_set("log_errors", 1);
ini_set ('display_errors', 1);
error_reporting (E_ALL);  
try
{   $sd = new CPSignedData();
    $content = "test content"; 
    $sd = new CPSignedData();
    $sd->set_Content($content); 
    printf("test init OKn");
}
catch (Exception $e)
{
    printf($e->getMessage());
} 
?>

Ответ:

Код: Выделить всё

Fatal error: Uncaught Error: Class 'CPSignedData' not found in /var/www/html/site/csp.php:6

Аватара пользователя

rozen

Сообщения: 169
Зарегистрирован: 25 мар 2015, 12:11
Имя: Андрей
Откуда: Красноярск

Re: КриптоПро расширение для PHP 7

Сообщение

rozen » 02 ноя 2020, 12:38

Продолжу:

Сделал:

Код: Выделить всё

php -i|grep php.ini
Configuration File (php.ini) Path => /etc/php/7.4/cli
Loaded Configuration File => /etc/php/7.4/cli/php.ini

Это странно, так как phpinfo показывает

Код: Выделить всё

Loaded Configuration File /etc/php/7.4/fpm/php.ini

Я вносил extension=libphpcades.so в файл /etc/php/7.4/fpm/php.ini
Сейчас внес в /etc/php/7.4/cli/php.ini

Делаю проверку:

Код: Выделить всё

sudo php -f /opt/cprocsp/src/phpcades/test_extension.php
[sudo] password for rozen:
Cannot find object or property. (0x80092004)TEST FAIL


Ответ поддержки КриптоПро:

Код: Выделить всё

>>sudo php -f /opt/cprocsp/src/phpcades/test_extension.php
>>[sudo] password for rozen:
>>Cannot find object or property. (0x80092004)TEST FAIL

Расширение корректно работает.

Если Вы запускаете проверочный скрипт через sudo, то под пользователем root у Вас должен быть установлен личный сертификат с привязкой к соответствующему ключевому контейнеру с указанной строкой (по умолчанию в скрипте — «Test») в поле «Субъект» сертификата.

Вы можете сменить строку в скрипте или пользователя для прохождения проверки с помощью тестового скрипта.

Аватара пользователя

Евгений

Сообщения: 446
Зарегистрирован: 11 июл 2016, 13:21
Имя: Евгений
Откуда: Петропавловск-Камчатский

Re: КриптоПро расширение для PHP 7

Сообщение

Евгений » 12 апр 2022, 02:18

rozen писал(а): ↑20 июл 2020, 11:42
Добрый день!
Кто-то установил расширение для PHP от КриптоПро?

Подскажите пожалуйста, какой версией php у вас получилось работать с ЭЦП на сервере Руководитель?
У меня PHP Version 7.3.31-1~deb10u1

Я настроил модуль ЭЦП, сертификаты видны в списке выбора, но при нажатии на кнопку «Выбрать» сертификат не подключается, выпадает ошибка: «при проверке токена, некорректные данные: []»

Screenshot_20220412_111737.png

Решение проблем при работе со смарт-картами

Решение проблем при работе со смарт-картами
При возникновении проблем в работе со смарт-картами нужно проверить следующее:

1. Смарт-карта видится в системе как три устройства:
Egate USB SmartCard
Egate Virtual Reader Enumerator
egate USB SmartCard Reader
Каждое из устройств должно видится без восклицательного знака.

Если хотя бы одно из устройств не определяется, или определяется с восклицательным знаком, удалите карту из USB порта, установите последние драйверы для карты отсюда: Latest version of the e-gate driver. После установки драйвера перезагрузите компьютер и вставьте карту.

2. Служба «Смарт-карты» запущена и работает.
Это можно сделать из Панель управления -> Администрирование -> Службы. Если она не запущена — ее следует запустить. Если служба не запускается, следует попытаться восстановить работоспособность подсистемы работы со смарт-картами Windows (Иногда бывает, что служба «Смарт-карты» не запускается т.к. отсутствует EXE файл C:WINDOWSsystem32scardsvr.exe, восстановите его из C:WINDOWSsystem32dllcachescardsvr.exe и запустите службу). Для этого скачайте приложенный к посту Smart-Card Repair и запустите его. Нажмите на кнопку Repair Step 1. После сообщения программы, что все ок. Перезагрузите компьютер. Снова запустите SmartCardRepair. Нажмите на кнопку Repair Step 2. После сообщения программы, что все ок снова перезапустите компьютер.

Коды ошибок и сообщения об ошибках:

Код:

$80100001:  'An internal consistency check failed.' Внутренний тест целостности не пройден $80100002:  'The action was cancelled by an SCardCancel request.'; Действие было отменено вызовом SCardCancel $80100003:  'The supplied handle was invalid.'; Переданный дескриптор некорректен $80100004:  'One or more of the supplied parameters could not be properly interpreted.'; Один или более переданных параметров не могут быть корректно интерпретированы. $80100005:  'Registry startup information is missing or invalid.'; Информация в регистре неверна или отсутствует $80100006:  'Not enough memory available to complete this command.'; Недостаточно памяти для завершения исполнения данной команды $80100007:  'An internal consistency timer has expired.'; Сработал таймер контроля внутренней целостности $80100008:  'The data buffer to receive returned data is too small for the returned data.'; Буфер данных для приема слишком мал для возвращаемых данных. $80100009:  'The specified reader name is not recognized.'; Переданное имя ридера не опознано $8010000A:  'The user-specified timeout value has expired.'; Заданный таймаут истек $8010000B:  'The smart card cannot be accessed because of other connections outstanding.'; Невозможно получить доступ к смарт-карте из-за того, что существуют другие открытые подключения к ней. $8010000C:  'The operation requires a Smart Card, but no Smart Card is currently in the device.'; Эта операция требует наличие смарт-карты, но смарт-карта не обнаружена. $8010000D:  'The specified smart card name is not recognized.'; Смарт-карта с заданным именем не обнаружена. $8010000E:  'The system could not dispose of the media in the requested manner.'; Система не может освободить ресурсы запрошенным способом. $8010000F:  'The requested protocols are incompatible with the protocol currently in use with the smart card.'; Запрошенные протоколы несовместимы с протоколами, которые используются для работы с картой в текущий момент. $80100010:  'The reader or smart card is not ready to accept commands.'; Ридер или смарт-карта не готовы к принятию команд. $80100011:  'One or more of the supplied parameters values could not be properly interpreted.'; Одно или более переданных значений параметров не могут быть корректно интерпретированы. $80100012:  'The action was cancelled by the system, presumably to log off or shut down.'; Действие было отменено из-за того, что был инициирован выход из системы или завершение работы. $80100013:  'An internal communications error has been detected.'; Произвошла ошибка при внутренней коммуникации $80100014:  'An internal error has been detected, but the source is unknown.'; Произошла внутренняя ошибка, но источник ошибки неизвестен $80100015:  'An ATR obtained from the registry is not a valid ATR string.'; Полученный ATR не является корректной ATR строкой. $80100016:  'An attempt was made to end a non-existent transaction.'; Была выполнена попытка завершить несуществующую транзакцию. $80100017:  'The specified reader is not currently available for use.'; Указанный ридер в настоящее время недоступен для использования. $80100018:  'The operation has been aborted to allow the server application to exit.'; Операция прервана, чтобы позволить приложению сервера успешно завершиться. $80100019:  'The PCI Receive buffer was too small.'; Буфер приема PCI слишком мал. $8010001A:  'The reader driver does not meet minimal requirements for support.'; Установленный драйвер ридера не удовлетворяет минимальным требованиям для поддержки $8010001B:  'The reader driver did not produce a unique reader name.'; Драйвер ридера не герерирует уникальное имя $8010001C:  'The smart card does not meet minimal requirements for support.'; Смарткарта не удовлетворяет минимальным требованиям для поддержки $8010001D:  'The Smart card resource manager is not running.'; Служба "Смарт-карты" (Scardsvr) не запущена. $8010001E:  'The Smart card resource manager has shut down.'; Служба "Смарт-карты" остановлена. $8010001F:  'An unexpected card error has occurred.'; Произошла неожиданная ошибка карты. $80100020:  'No Primary Provider can be found for the smart card.'; Первичный провайдер для данной карты не найден. $80100021:  'The requested order of object creation is not supported.'; Запрошенный порядок создания объектов не поддерживается $80100022:  'This smart card does not support the requested feature.'; Смарткарта не поддерживает запрошенную возможность. $80100023:  'The identified directory does not exist in the smart card.'; Указанный каталог на карте не существует. $80100024:  'The identified file does not exist in the smart card.'; Указанный файл на карте не существует. $80100025:  'The supplied path does not represent a smart card directory.'; Переданный путь не является корректным именем каталога смарт-карты $80100026:  'The supplied path does not represent a smart card file.'; Переданный путь не является корректным именем файла $80100027:  'Access is denied to this file.'; Доступ к файлу отвергнут $80100028:  'The smartcard does not have enough memory to store the information.'; У смарткарты недостаточно памяти для хранения информации $80100029:  'There was an error trying to set the smart card file object pointer.'; Возникла ошибка при попытке установить указать на объект смарт-карты $8010002A:  'The supplied PIN is incorrect.'; Переданный PIN-код некорректен $8010002B:  'An unrecognized error code was returned from a layered component.'; От компонента получен нераспознанный код ошибки $8010002C:  'The requested certificate does not exist.'; Запрошенный сертификат не существует $8010002D:  'The requested certificate could not be obtained.'; Запрошенный сертификат не может быть получет $8010002E:  'Cannot find a smart card reader.'; Невозможно найти кардридер $08010002F:  'A communications error with the smart card has been detected. Retry the operation.'; Возникла ошибка при обмене информации с картой. Повторите операцию. $080100030:  'The requested key container does not exist on the smart card.'; Запрошенный контейнер ключей на карте не существует $80100065:  'The reader cannot communicate with the smart card, due to ATR configuration conflicts.'; Ридер не может работать с картой из-за конфликтов конфигураций ATR $80100066:  'The smart card is not responding to a reset.'; Смарт-карта не отвечает на сигнал сброса $80100067:  'Power has been removed from the smart card, so that further communication is not possible.'; Питание на карту более не подается, дальнейшая работа с картой невозможна. $80100068:  'The smart card has been reset, so any shared state information is invalid.'; Смарткарте передан сигнал сброса, поэтому любые общие данные некорректны. $80100069:  'The smart card has been removed, so that further communication is not possible.'; Смарткарта удалена, дальнейший обмен информацией с ней невозможен. $8010006A:  'Access was denied because of a security violation.'; Доступ отвергнут из-за нарушения безопасности $8010006B:  'The card cannot be accessed because the wrong PIN was presented.'; Невозможно произвести доступ к карте, поскольку передан некорректный код PIN $8010006C:  'The card cannot be accessed because the maximum number of PIN entry attempts has been reached.'; Невозможно получить доступ к карте, поскольку количество попыток ввести правильный PIN код было слишком велико. $8010006D:  'The end of the smart card file has been reached.'; Достигнут конец файла на смарткарте $8010006E:  'The action was cancelled by the user.'; Действие отменено пользователем $08010006F:  'No PIN was presented to the smart card.'; Смарткарте не был передан PIN код.

у меня одновременно к компу подключены и без проблем работают с софтом Setool, J.A.F., P-key (совместимый с Windows Vista), SmartClip, S-Card, UFS+HWK, NSPro, MT-box, Spider-man. Помимо этого, использую в своей работе ключи ruToken и eToken для доступа к Клиент-Сервису системы «Контур-Экстерн». В работе есть единственный минус — передергивание карты P-key, ну да это самое маленькое зло из всех возможных, имхо. Надеюсь, что со временем этот баг будет окончательно пофиксен разработчиками ПО JAF.

вопросы

Из нашей статьи вы узнаете:

ЭЦП — довольно сложный цифровой продукт, обращение с которым в определенных ситуациях может потребовать некоторых навыков и знаний. Например, в ходе установки сертификатов ЭП посредством «КриптоПро» после выбора соответствующего ключевого контейнера нередко выдаются неприятные сообщения об ошибке вследствие отсутствия открытого шифровочного ключа, который необходим для обеспечения информационной безопасности, без чего система не будет принимать ЭЦП.

Такую ошибку несложно устранить без вызова специалиста или обращения в службу поддержки. Алгоритм действий, направленных на решение этой проблемы, приводится ниже.

Что может послужить причиной такой ошибки

ошибка в контейнере закрытого ключа и причины её появления

Всплывающее окно со злополучным сообщением об ошибке появляется на экранах пользователей в тех случаях, если система не смогла обнаружить соответствующий ключ на носителе. Такая ситуация происходит при следующих действиях пользователей:

  • установка сертификата впервые;
  • экспортирование данных на внешний носитель;
  • попытка просмотра ключей в контейнерах ключей;
  • загрузка информации на компьютер извне.

В целях устранения ошибки обычно бывает достаточно произвести корректную ручную переустановку сертификата.

Решение ошибки: отсутствие электронного сертификата в контейнере закрытого ключа

Для начала запускаем «КриптоПро» нажатием кнопки «Пуск». Затем выбираем «Настройку», в возникающем на мониторе окне заходим в опцию панели управления, далее «сервис – установить личный сертификат».

программа криптопро предложит указать место хранение сертификата

Далее, через кнопку «обзор» указываем путь, где сохранен открытый ключ – файл с расширением *.cert или *.crt

Необходимо выбрать файл и открыть его с помощью криптопро

Жмём «Далее», в мастере установки сертификата мы увидим путь, который указывали до нашего сертификата.

Убедившись, что криптопро верно распознало путь установки сертификата, подтверждаем установку

Нам отображается информация, содержащаяся в открытом ключе на пользователя, жмём «далее»

Перед импортом сертификата надо проверить содержащуюся в нем информацию

В следующем окне можно воспользоваться двумя путями поиска нужного контейнера закрытого ключа:

  • «найти контейнер автоматически
  • вручную через «обзор»

В первом случае КриптоПро на основе данных из открытого ключа подберет закрытый, в случае с ручным поиском нужно будет знать название закрытого ключа, чтобы выбрать его для установки

Мы рекомендуем использовать функцию КриптоПро «найти контейнер автоматически» или указать его вручную через «обзор»

Самый простой вариант выбрать автоматический поиск, затем после «обнаружения» необходимого контейнера, мы увидим заполненную строчку с его именем и после жмём «Далее»

после того, как указан контейнер, можно продолжить установку

Личный сертификат пользователя всегда устанавливается в хранилище «Личное», можно выбрать как вручную, так и КриптоПро может сделать это за вас по умолчанию, затем подтверждаем установку цепочки сертификатов и жмём «Далее»

Важно! Не забудьте поставить галку в настройках КриптоПро «установить сертификат (цепочку сертификатов) в контейнер>

В случае успешной установки КриптоПро выдаст окно с информацией об окончании процедуры и жмём «Готово»

Можно завершать установку сетификата

Затем появится окно с подтверждением данной операции, жмём «ДА»

Криптопро предложит перезаписать сертификат – соглашаемся

В следующем окне увидим информацию о том, что процесс окончен успешно. Сертификат установлен в контейнер закрытого ключа.

Готово. Сертификат установлен

Особенности версий КриптоПро

С января 2019 года квалифицированные сертификаты могут выпускаться только по ГОСТ 2012, выпуск по другому ГОСТу прекращен. Мы об этом писали ранее в статье. Важно помнить, что версии криптопро на ГОСТ 2012 работают только с версии 4.0 и выше. Все старые версии КриптоПро, для нормальной работы, потребуется обновить или заменить на актуальную. Сделать это нужно не позднее 31 декабря 2019 года.

Неизвестный криптографический алгоритм (80091002)

  На компьютере не установлено приложение от криптопровайдера, указанного в сертификате, которым осуществляется попытка наложения ЭЦП либо которым подписан документ (при проверке ЭЦП) — см. свойство сертификата «Алгоритм подписи». Например, ПО от Крипто Про, если ключевая пара (открытый и закрытый) созданы по ГОСТ .

 Не удается найти указанный файл  (00000002)

  Возможные причины:

сертификат установлен без закрытого ключа.
рутокен (носитель с сертификатом) поврежден/неисправен .
применяется (вставлен в компьютер) не тот рутокен (носитель) — не от выбираемого сертификата. Например, в период смены сертифкатов, используется прежний еще действующий сертификат, а носитель вставляют от нового сертификата.

 Неизвестная ошибка. (C000000D)

Проблема в совместимости ПО «Крипто Про» и «Континент АП», способы решения см на форумах соответствующих ПО. См так же обсуждение  на форуме «Бюджет-СМАРТ» https://keysystems.ru/forum/index.php?showtopic=19187&p=157205 .

 Статус аннулирования сертификатов не выяснен. Не удалось загрузить действующий список отозванных сертификатов — состояние (статус) ЭЦП.

 Не удается построить цепочку сертификатов для доверенного корневого центра — сообщение при наложении ЭЦП.

  Возможные причины:

корневой сертификат УЦ не соответствует сертифкатам пользователей;
корневой сертификат УЦ отсутствует на сервисе ОД/сервере ключей;
корневой сертификат УЦ установлен неверно (местоположение не «локальный компьютер»/реестр, см. описание «Сервис проверки ЭЦП»).

  Корневой сертификат УЦ обычно обновляется ежегодно. На сервисе ОД должен быть установлен корневой сертификат УЦ, под которым выдавались ключи пользователям.

  Примеры ситуаций, приводящие к вышеприведенной ошибке: часть пользователей имеют ключи 2011г, часть 2012г, установлен корневой сертификат 2012г — пользователи с сертификатами 2011г не смогут подписать (либо их подпись станет неверна).

 Один из сертификатов в цепочке не является доверенным — причина в том, что корневой сертификат УЦ не установлен в список «Доверенные корневые центры сертификации» на компьютере, где проверяется ЭЦП.

 nastr_ecp_error_dover

 Документ не удовлетворяет условиям схем работы с ЭП  

 Нет подходящего варианта в автомате ЭЦП для данного документа. Если автомат не настраивался, то не следует включать настройку «Использовать Автомат ЭЦП».

Невозможно создать файл, так как он уже существует.

B7: CryptMsgUpdate

При установке сертификата на компьютер пользователя средствами Крипто ПРО был выбран неверный криптопровайдер в поле «Выберите CSP для поиска ключевых контейнеров».

Возникла ошибка при соединении с сервисом проверки ЭЦП: …

  Настройка «Меню Настройки: НАСТРОЙКИ Электронная подпись Сервис проверки ЭЦП» указана неверно (несуществующий адрес), либо SQL сервер не может подключиться к сервису ОД из указанной настройки (ограничения сетевых экранов, антивирусы и т.п.).

Отказано в доступе. 80090010: CryptMsgOpenToEncode HResult: -2146233296

  Истёк срок действия закрытого ключа. Для получения подробных сведений о сроках и причинах, следует протестировать контейнер закрытого ключа в ПО «Крипто Про» — обратить внимание на информацию вида:

Срок действия закрытого ключа       20 января 2019 г. 11:27:15

Использование ключа обмена          запрещено. Срок действия закрытого ключа истек…..

Сannot connect или Cannot resolve IP address или Error get version

  При применении Сервера ключей (устарело): данные сообщения означают, что не удалось обратиться к серверу ключей: неверно указана настройка сервера ключей, либо на сервере ключей не запущена программа проверки ЭЦП (CertServer.exe), либо не удалось соединиться с сервером ключей (антивирус, брандмауер и т.д.) и т.п. причины.

ИСТОЧНИК

Hi, I was advised to create an issue here after I created an Intune ticket in the Microsoft Q&A forums (https://docs.microsoft.com/en-us/answers/questions/70809/0x8010002c-request-certificate-does-not-exist-duri.html)

I am trying to integrate a Third-party CA to work with Intune SCEP to issue certificates according to https://docs.microsoft.com/en-us/mem/intune/protect/scep-libraries-apis. I am using the CsrValidation api for Java to integrate.

My issue is not really with the CsrValidation API.

I have setup the following Configuration profiles in Azure Endpoint manager:
Trusted Certificate: Computer store — Root (Root CA)
Trusted Certificate: Computer store — Intermediate (Root CA)
Trusted Certificate: Computer store — Intermediate (Intermediate CA)
SCEP Certificate: Windows 10.

All 3 Trusted Certificate Profiles are successfully deployed to the WIN10 device.
device_status_root_store
device_status_inter_store

To enrol the Windows 10 Device I go to ‘Settings -> Account -> Access work or school -> Connect’. The Windows UI says that the connection is successful.

However, when looking in the Windows 10 Event Viewer under ‘Applications and Services Logs/Microsoft/Windows/DeviceManagement-Enterprise-Diagnostics-Provider’ it gives the following two errors:

Event 307: SCEP: Failed LogError Message : (SCEPInstallCertificateWithScepHelper:Failed to Initialize SCEP enrollment with NDES Server ‘http://{url}/scep/intune/pkiclient.exe’, CA cert thumbprint ‘2FCF40…CEF1’ and server )

Event 32: SCEP: Certificate enroll failed. Result: (The requested certificate does not exist.). [HRESULT: 0x8010002c]

These 2 errors occurs after the ‘GetCACertChain’ call has been made from the WIN10 device and the CA SCEP RA has returned the chain in PKCS#7 format containing the Root CA, Intermediate CA and the RA certificate.

The thumbprint in Event 307 is the same as the thumbprint of my Root CA.

Any ideas on what I have misconfigured to get this error?


Offline

akulema

 


#1
Оставлено
:

3 декабря 2008 г. 13:48:25(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Здравствуйте, а можно ли имея контейнер КриптоПро на флешке получить сертификат этого ключа?

то есть я имею нечто следующее

Код:

if(!CryptAcquireContext(&hCryptProvCA, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
		{			
			return false;
		}

		cbData=1000;
		pbData = new BYTE[1024];
		if(!CryptGetProvParam( hCryptProvCA, PP_SELECT_CONTAINER , 	pbData, &cbData, 	0))
		{			
			return false;
		}

		CString kontainer_name=pbData;
		CryptReleaseContext(hCryptProvCA, 0);

		if(!CryptAcquireContext(  &hCryptProvCA,    kontainer_name,    NULL,   PROV_GOST_2001_DH,    0))
		{			
			return false;
		}

из контекста можно ли при этом что-нибудь выцепить?


Вверх

Offline

Максим Коллегин

 


#2
Оставлено
:

3 декабря 2008 г. 14:28:31(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,276
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 668 раз в 589 постах

Если в контейнере есть сертификат, то GetUserKey, GetKeyParam(KP_CERTIFICATE)

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

akulema

 


#3
Оставлено
:

3 декабря 2008 г. 14:37:05(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Прошу прощения, может, за глупый вопрлс, но где находятся эти функции?


Вверх

Offline

Максим Коллегин

 


#4
Оставлено
:

3 декабря 2008 г. 16:22:23(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,276
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 668 раз в 589 постах

CryptGetUserKey, CryptGetKeyParam — там же, где и CryptAcquireContext

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

akulema

 


#5
Оставлено
:

3 декабря 2008 г. 18:41:12(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Спасибо, сразу не понял, что это было сокращенно =))


Вверх

Offline

akulema

 


#6
Оставлено
:

5 декабря 2008 г. 13:08:56(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Столкнулся с проблемой. Функция

Код:


CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0);

возвращает ошибку, говорит, что «Требуемый сертификат не существует». А можно ли тогда при создании записать сертификат в ключ?

P.S. Хотя, по идее, он должен быть уже в ключе

Добавлю код, которым пытаюсь получить сертификат, может, что-то не так делаю

Код:

if(!CryptAcquireContext(&hCryptProvCA, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
		{
			ShowError(GetLastError());
			return false;
		}

		cbData=1000;
		pbData = new BYTE[1024];
		if(!CryptGetProvParam( hCryptProvCA, PP_SELECT_CONTAINER , 	pbData, &cbData, 	0))
		{
			ShowError(GetLastError());
			return false;
		}

		CString kontainer_name=pbData;
		CryptReleaseContext(hCryptProvCA, 0);

		if(!CryptAcquireContext(  &hCryptProvCA,    kontainer_name,    NULL,   PROV_GOST_2001_DH,    0))
		{
			ShowError(GetLastError());
			return false;
		}		

		if(!CryptGetProvParam(hCryptProvCA, PP_CONTAINER, pbData, &cbData, 	0))
			throw("Не удалось определить имя контейнера");

		// получаем контекст сертификата ключа УЦ
		HCRYPTKEY hKey=0;
		if(!CryptGetUserKey( hCryptProvCA, AT_SIGNATURE  , &hKey))
		{
			if(!CryptGetUserKey( hCryptProvCA, AT_KEYEXCHANGE  , &hKey))
				throw ("Error during CryptGetUserKey for signkey.");			
		}

		// Проверяем сертификат
		DWORD dwUserCertLength=0;
		BYTE *UserCertBuf = 0;

		if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, UserCertBuf, &dwUserCertLength, 0))
		{
			ShowError(GetLastError());			
			throw ("Ошибка при получении сертификата (1).");
		}

		UserCertBuf=new BYTE[dwUserCertLength];

		if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, UserCertBuf,&dwUserCertLength, 0))
			throw ("Ошибка при получении сертификата (2).");

Ошибку выдает первый CryptGetKeyParam

Отредактировано пользователем 5 декабря 2008 г. 13:50:14(UTC)
 | Причина: Не указана


Вверх

Offline

Максим Коллегин

 


#7
Оставлено
:

5 декабря 2008 г. 14:37:43(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,276
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 668 раз в 589 постах

Сертификата может и не быть в контейнере. Устанавливается функцией CryptSetKeyParam

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

akulema

 


#8
Оставлено
:

5 декабря 2008 г. 15:06:19(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Действительно, сертификат просто не добавлялся в ключ. Спасибо.


Вверх
Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Версия VipNeT CSP —  4.2 (2.36190)

Контейнер ключей расположен на USB «флешке» и зарегистрирован для CSP с помощью кнопки <Добавить контейнер>,

При получении списка контейнеров виден как h:/infotecs/containers/abn_0cf8.key

Функция CryptGetProvParam с параметром PP_CONTAINER возвращает пусто.

Функция CryptGetProvParam с параметром PP_UNIQWUE_CONTAINER тоже возвращает пусто.

Как я и писал, вызов функции CryptGetUserKey(AT_KEYEXCHNAGE) приводит к появлению окна запроса пароля (вложил картинку). Это наверное правильно — я получаю доступ к контейнеру ключей. Но как получить доступ без пароля к публичному ключу. Как это делает сам CSP, отображая сертификат?

Вызов CryptExportPublicKeyInfo тоже приводит к запросу пароля.

Если открыть контейнер с флагом CRYPT_SILENT получаю ошибку: Поставщик не смог выполнить действие, поскольку контекст был получен как «тихий».

pwd.jpg


Offline

akulema

 


#1
Оставлено
:

3 декабря 2008 г. 13:48:25(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Здравствуйте, а можно ли имея контейнер КриптоПро на флешке получить сертификат этого ключа?

то есть я имею нечто следующее

Код:

if(!CryptAcquireContext(&hCryptProvCA, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
		{			
			return false;
		}

		cbData=1000;
		pbData = new BYTE[1024];
		if(!CryptGetProvParam( hCryptProvCA, PP_SELECT_CONTAINER , 	pbData, &cbData, 	0))
		{			
			return false;
		}

		CString kontainer_name=pbData;
		CryptReleaseContext(hCryptProvCA, 0);

		if(!CryptAcquireContext(  &hCryptProvCA,    kontainer_name,    NULL,   PROV_GOST_2001_DH,    0))
		{			
			return false;
		}

из контекста можно ли при этом что-нибудь выцепить?


Вверх


Offline

Максим Коллегин

 


#2
Оставлено
:

3 декабря 2008 г. 14:28:31(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,281
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 673 раз в 593 постах

Если в контейнере есть сертификат, то GetUserKey, GetKeyParam(KP_CERTIFICATE)

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

akulema

 


#3
Оставлено
:

3 декабря 2008 г. 14:37:05(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Прошу прощения, может, за глупый вопрлс, но где находятся эти функции?


Вверх


Offline

Максим Коллегин

 


#4
Оставлено
:

3 декабря 2008 г. 16:22:23(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,281
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 673 раз в 593 постах

CryptGetUserKey, CryptGetKeyParam — там же, где и CryptAcquireContext

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

akulema

 


#5
Оставлено
:

3 декабря 2008 г. 18:41:12(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Спасибо, сразу не понял, что это было сокращенно =))


Вверх


Offline

akulema

 


#6
Оставлено
:

5 декабря 2008 г. 13:08:56(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Столкнулся с проблемой. Функция

Код:


CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0);

возвращает ошибку, говорит, что «Требуемый сертификат не существует». А можно ли тогда при создании записать сертификат в ключ?

P.S. Хотя, по идее, он должен быть уже в ключе

Добавлю код, которым пытаюсь получить сертификат, может, что-то не так делаю

Код:

if(!CryptAcquireContext(&hCryptProvCA, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
		{
			ShowError(GetLastError());
			return false;
		}

		cbData=1000;
		pbData = new BYTE[1024];
		if(!CryptGetProvParam( hCryptProvCA, PP_SELECT_CONTAINER , 	pbData, &cbData, 	0))
		{
			ShowError(GetLastError());
			return false;
		}

		CString kontainer_name=pbData;
		CryptReleaseContext(hCryptProvCA, 0);

		if(!CryptAcquireContext(  &hCryptProvCA,    kontainer_name,    NULL,   PROV_GOST_2001_DH,    0))
		{
			ShowError(GetLastError());
			return false;
		}		

		if(!CryptGetProvParam(hCryptProvCA, PP_CONTAINER, pbData, &cbData, 	0))
			throw("Не удалось определить имя контейнера");

		// получаем контекст сертификата ключа УЦ
		HCRYPTKEY hKey=0;
		if(!CryptGetUserKey( hCryptProvCA, AT_SIGNATURE  , &hKey))
		{
			if(!CryptGetUserKey( hCryptProvCA, AT_KEYEXCHANGE  , &hKey))
				throw ("Error during CryptGetUserKey for signkey.");			
		}

		// Проверяем сертификат
		DWORD dwUserCertLength=0;
		BYTE *UserCertBuf = 0;

		if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, UserCertBuf, &dwUserCertLength, 0))
		{
			ShowError(GetLastError());			
			throw ("Ошибка при получении сертификата (1).");
		}

		UserCertBuf=new BYTE[dwUserCertLength];

		if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, UserCertBuf,&dwUserCertLength, 0))
			throw ("Ошибка при получении сертификата (2).");

Ошибку выдает первый CryptGetKeyParam

Отредактировано пользователем 5 декабря 2008 г. 13:50:14(UTC)
 | Причина: Не указана


Вверх


Offline

Максим Коллегин

 


#7
Оставлено
:

5 декабря 2008 г. 14:37:43(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,281
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 673 раз в 593 постах

Сертификата может и не быть в контейнере. Устанавливается функцией CryptSetKeyParam

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

akulema

 


#8
Оставлено
:

5 декабря 2008 г. 15:06:19(UTC)

akulema

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Действительно, сертификат просто не добавлялся в ключ. Спасибо.


Вверх

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

I’m trying to use the CryptoAPI (CAPI) to perform a Diffie Hellman Key Exchange. I’m using the MSDN documentation.

        // Step 0) Acquire context
        if (!CAPI.CryptAcquireContext(ref this._cryptographicProvider, null, null, CAPI.PROV_DSS_DH, CAPI.CRYPT_VERIFYCONTEXT))
            HandleWin32Error("Unable to acquire cryptographic context");

        // Setp 1) Generate private key
        if (!CAPI.CryptGenKey(this._cryptographicProvider, CAPI.CALG_DH_EPHEM, DHKEYSIZE << 16 | CAPI.CRYPT_EXPORTABLE | CAPI.CRYPT_PREGEN, ref this._privateKeyPointer))
            HandleWin32Error("Unable to generate private cryptographic key");

        uint gSize = 0;
        CAPI.CryptGetKeyParam(this._privateKeyPointer, CAPI.KP_G, null, ref gSize, (uint)0);

        byte[] g = new byte[gSize];
        var res = CAPI.CryptGetKeyParam(this._privateKeyPointer, CAPI.KP_G, g, ref gSize, (uint)0);

The first call CryptGetKeyParam works perfectly, i.e. it successfully returns the size of g, as 64.

Then the code fails on the last line, either by returning nothing to the g buffer (as is the case in that example) with res = true, or with an AccessViolationException when I use the following call:

var res = CAPI.CryptGetKeyParam(this._privateKeyPointer, CAPI.KP_G, ref g, ref gSize, (uint)0);

Yes, I’ve overloaded the PInvoke methods:

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool CryptGetKeyParam(IntPtr hKey, uint dwParam, ref byte[] pbData, ref uint pdwDataLen, uint dwFlags);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool CryptGetKeyParam(IntPtr hKey, uint dwParam, byte[] pbData, ref uint pdwDataLen, uint dwFlags);

Any thoughts/ideas on this?

*Interestingly, I have managed to get a complete Diffie Hellman Key Exchange to work, i.e. successfully agreeing the same secret (s1) between two parties. But this is with pre-defined P and G parameters. I’m re-working the code because something didn’t seem to be correct as the derived secret was the same for every key exchange, implying that X was consistent. (i.e. Bob and Alice agreed on s1 every single time!?) — Here I, again, had an issue with CryptGetKeyParam as I was unable to determine the size of the session key when using KP_KEYLEN?!
*


Offline

dot9889

 


#1
Оставлено
:

1 июля 2015 г. 5:44:21(UTC)

dot9889

Статус: Участник

Группы: Участники

Зарегистрирован: 29.06.2015(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 4 раз

Здравствуйте, скажите где здесь ошибка?

Цитата:

[DllImport(«advapi32.dll», CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptGetKeyParam(
IntPtr hProv,
uint dwParam,
[Out] byte[] pbData,
[In, Out] ref uint pdwDataLen,
uint dwFlags);

Цитата:

public static void GetCertFromContainer()
{
uint BUFFSIZE = 512;
ArrayList containernames = new ArrayList();
byte[] pcbData= { };
//String provider = null; //can use null, for default provider
String provider = «Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider»;
String container = null; //required for crypt_verifycontext
uint type = PROV_RSA_FULL;
uint cspflags = CRYPT_VERIFYCONTEXT | CSPKEYTYPE; //no private key access required.
IntPtr hProv = IntPtr.Zero;

bool gotcsp = Win32.CryptAcquireContext(ref hProv, container, provider, type, cspflags);
Win32.CryptGetKeyParam( hProv, KP_CERTIFICATE, pcbData,ref BUFFSIZE, 0);

}

CryptGetKeyParam возвращает false. Я пытаюсь разобраться как мне получить сертификат открытого ключа, но я не понимаю чем вообще инициализировать [In, Out] byte[] pbData- я так понимаю что я неправильно делаю. И до меня если честно не доходит пройтись по списку контейнеров отображаемых в КриптоПро?


Вверх


Offline

Максим Коллегин

 


#2
Оставлено
:

1 июля 2015 г. 7:56:52(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,281
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 673 раз в 593 постах

Все Ваши темы не имеют отношения к КриптоПро .NET — создавайте в других разделах.
Последовательность вызовов:
AcquireContext
GetUserKey
GetKeyParam
Посмотрите примеры в SDK.

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW

thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.

dot9889

оставлено 01.07.2015(UTC)


Offline

dot9889

 


#3
Оставлено
:

1 июля 2015 г. 8:04:25(UTC)

dot9889

Статус: Участник

Группы: Участники

Зарегистрирован: 29.06.2015(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 4 раз

Хорошо понял извините, попробую разобраться.Спасибо.


Вверх

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

  • Remove From My Forums
  • Question

  • First I’m not sure if this is the right forum, if not which would be better suited?

    I want to sign Xml document using certificate stored on a smartcard. So I obtain the X509Certificate2 object and then I try to get it’s private key:
    X509Certificate2 cert = X509Certificate2UI.SelectFromCollection(store.Certificates, «qaz», «wsx», X509SelectionFlag.SingleSelection)[0];
    RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
    and on the second line I get CryptographicException («Bad UID»). This is probably (that’s what I found out after debugging .NET classes) because internally called CryptGetKeyParam(KP_ALGID) function returned NTE_BAD_UID error. Which translates to «The CSP context that was specified when the key was created cannot be found.» But what does that mean? Thanks in advance,

    EDIT: The configuration is for sure ok since I can sign documents using this certificate with another application. My colleague reported (and it was also heavily tested) that writing pure C++/CryptoAPI code for this smartcard works as well. There must be something wrong with .NET classes…

    • Edited by

      Monday, September 15, 2008 1:39 PM

Понравилась статья? Поделить с друзьями:
  • Функционально стилистические и нормативно стилистические ошибки
  • Фрмо ошибка 404
  • Функционально стилистическая окраска слова может вызвать синтаксическую ошибку
  • Фритюрницы коды ошибок
  • Функциональная ошибка это