Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline fenw  
#1 Оставлено : 23 апреля 2021 г. 19:27:51(UTC)
fenw

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

Группы: Участники
Зарегистрирован: 17.06.2014(UTC)
Сообщений: 19
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Добрый день!

Импортирую сертификат:
Код:

if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE|CRYPT_SILENT)))

Все отлично проходит

При подписи хотелось бы проверять пароль пользователя:
Код:

if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {

                    CleanUp();
                    BYTE *pbSignedMessageBlob=new BYTE[0];
                    return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
                 }else {
                     NSLog(@"[%@] MY cert store opened. %lu", NSStringFromSelector(_cmd),hCryptProv);
                 }
                
                
            
                if(!CryptSetProvParam(hCryptProv,PP_SIGNATURE_PIN,(BYTE *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL)) {
                    retValue = CSP_GetLastError();
                    fprintf (stderr, "Last error before acquire 0x%08x \n",retValue);
                    CleanUp();
                    BYTE *pbSignedMessageBlob=new BYTE[0];
                    return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
				}else{
                    retValue = CSP_GetLastError();
                    fprintf (stderr, "Last error after pin 0x%08x \n",retValue);
                }


Но CryptSetProvParam всегда при правильном и неправильно пароле возвращает 0x8010006B
Если сделать импорт сертификата без CRYPT_SILENT

Код:

if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE)))


то пароль вводится и у меня и в окно КриптоПро, но проверка CryptSetProvParam отрабатывает корректно - если пароль передан неправильный появляется окно КриптоПро при подписании и спрашивает пароль еще раз, если пароль передан правильный - ничего не появляется

Как сделать так, чтобы при SILENT импорте корректно отрабатывал CryptSetProvParam?
Offline Андрей Русев  
#2 Оставлено : 26 апреля 2021 г. 11:25:06(UTC)
Андрей Русев

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 751

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Здравствуйте.
Если я правильно вас понял, вы хотите импортировать без окон (silent), но при этом хотите иметь непустой пароль на импортированный контейнер. CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN) для уже созданного контейнера не задаёт (меняет), а предъявляет пароль. Для смены пароля надо использовать PP_CHANGE_PIN:
http://cpdn.cryptopro.ru...95347460fbd602e042a.html
Почему без silent на неверный пароль CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN) не возвращает ошибку? В этом была особенность КриптоПро CSP 4.0 и более старых версий: они принимали во внимание переданный pin, но проверка его значения откладывалась до момента использования ключа (подписи, например), поэтому при самом предъявлении pin-а ошибка никогда не возвращалась (даже если он неверный). В КриптоПро CSP 5.0 мы стали проверять значение pin-а прямо на CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN), так что теперь при неверном pin-е здесь будет возвращаться ошибка.

Обращу ваше внимание на то, что при PFXImportCertStore(CRYPT_SILENT) подавляется не только окно ввода пароля, но и окно выбора носителя, на который будет импортирован контейнер. Это, как правило, означает, что импорт будет на носитель REGISTRY на Windows и HDIMAGE на Unix.
Официальная техподдержка. Официальная база знаний.
Offline fenw  
#3 Оставлено : 26 апреля 2021 г. 12:15:42(UTC)
fenw

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

Группы: Участники
Зарегистрирован: 17.06.2014(UTC)
Сообщений: 19
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Здравствуйте, не совсем все так:

1) я хочу в silent режиме импортировать сертификат, это получается, пароль устанавливаю
2) далее я хочу при подписи проверить пин к сертификату, который вводит пользователь и использую CryptSetParam
3) в случае п.1 CryptSetParam всегда возвращает ошибку неверного пина
4) если в п 1 импортировать не в silent режиме, то п3 отработает как нужно

Вопрос - как сделать 1 и 2 пункт, чтобы не было ошибки неверного пина
Offline Андрей Русев  
#4 Оставлено : 26 апреля 2021 г. 12:30:08(UTC)
Андрей Русев

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 751

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Всё же я ставлю на то, что у вас ошибка в п.1 и вы не устанавливаете (задаёте/меняете) пароль на контейнер - пароль остаётся пустой. Надо использовать PP_CHANGE_PIN.
Официальная техподдержка. Официальная база знаний.
Offline fenw  
#5 Оставлено : 26 апреля 2021 г. 15:09:29(UTC)
fenw

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

Группы: Участники
Зарегистрирован: 17.06.2014(UTC)
Сообщений: 19
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Если в
Код:

 if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE|CRYPT_SILENT))) {

Передать неверный пароль, то импорт упадет с ошибокой
Не спорю и скорей всего контейнер остается без пароля после импорта, но не могу понять как мне его установить:
1) найти сертификат?
2) сделать CryptAcquireCertificatePrivateKey с передачей туда сертификата и hCryptProv на инициализацию
3) сделать if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL)
Так?
Offline Андрей Русев  
#6 Оставлено : 27 апреля 2021 г. 12:05:46(UTC)
Андрей Русев

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 751

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Да, примерно так. П.1 надо делать прямо в hCertStore, который вернул PFXImportCertStore.
Официальная техподдержка. Официальная база знаний.
Offline fenw  
#7 Оставлено : 27 апреля 2021 г. 18:25:50(UTC)
fenw

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

Группы: Участники
Зарегистрирован: 17.06.2014(UTC)
Сообщений: 19
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Сделал, добавил после pfx импорта

Код:

if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
                        
                        CleanUp();
                        return nil;
                    }else {
                        NSLog(@"[%@] Found private key. %lu", NSStringFromSelector(_cmd),hCryptProv);
                    }
                    CRYPT_PIN_PARAM pinParam;
                    pinParam.type = CRYPT_PIN_PASSWD;
                    pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding];
                    
                    if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)&pinParam, NULL)) {
                        
                        fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError());
                        CleanUp();
                        [self handleException:WLI_CRYPTO_CERT_ADD_TO_STORE_EXCEPTION_REASON];
                        return nil;
                    }else{
                        fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError());
                    }

Ошибок нет

При подписании делаю
Код:

if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
                
                CleanUp();
                BYTE *pbSignedMessageBlob=new BYTE[0];
                return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
            }else {
                NSLog(@"[%@] Found private key %lu", NSStringFromSelector(_cmd),hCryptProv);
            }
            
            CRYPT_PIN_PARAM pinParam;
            pinParam.type = CRYPT_PIN_PASSWD;
            pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding];
            
             if(!CryptSetProvParam(hCryptProv,PP_KEYEXCHANGE_PIN,(BYTE *)&pinParam, NULL)) {
             retValue = CSP_GetLastError();
             fprintf (stderr, " ############ Last error after pin 0x%08x \n",retValue);
             CleanUp();
             BYTE *pbSignedMessageBlob=new BYTE[0];
             return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
             }else{
             retValue = CSP_GetLastError();
             fprintf (stderr, " ############ Last error after pin 0x%08x \n",retValue);
             }

И получаю 0x8010006b
Не помогло :(
Может есть еще идеи?
Offline Андрей Русев  
#8 Оставлено : 28 апреля 2021 г. 10:26:32(UTC)
Андрей Русев

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 751

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Вы слишком увлекаетесь copy-paste-ом. CryptSetProvParam(PP_KEYEXCHANGE_PIN) принимает строку.
Официальная техподдержка. Официальная база знаний.
thanks 1 пользователь поблагодарил Андрей Русев за этот пост.
fenw оставлено 28.04.2021(UTC)
Offline fenw  
#9 Оставлено : 28 апреля 2021 г. 13:35:35(UTC)
fenw

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

Группы: Участники
Зарегистрирован: 17.06.2014(UTC)
Сообщений: 19
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Вы правы, спасибо, взлетело
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.