Статус: Участник
Группы: Участники
Зарегистрирован: 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?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,271
Сказал(а) «Спасибо»: 22 раз Поблагодарили: 446 раз в 325 постах
|
Здравствуйте. Если я правильно вас понял, вы хотите импортировать без окон (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. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 17.06.2014(UTC) Сообщений: 19 Откуда: Москва Сказал(а) «Спасибо»: 5 раз
|
Здравствуйте, не совсем все так:
1) я хочу в silent режиме импортировать сертификат, это получается, пароль устанавливаю 2) далее я хочу при подписи проверить пин к сертификату, который вводит пользователь и использую CryptSetParam 3) в случае п.1 CryptSetParam всегда возвращает ошибку неверного пина 4) если в п 1 импортировать не в silent режиме, то п3 отработает как нужно
Вопрос - как сделать 1 и 2 пункт, чтобы не было ошибки неверного пина
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,271
Сказал(а) «Спасибо»: 22 раз Поблагодарили: 446 раз в 325 постах
|
Всё же я ставлю на то, что у вас ошибка в п.1 и вы не устанавливаете (задаёте/меняете) пароль на контейнер - пароль остаётся пустой. Надо использовать PP_CHANGE_PIN. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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) Так?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,271
Сказал(а) «Спасибо»: 22 раз Поблагодарили: 446 раз в 325 постах
|
Да, примерно так. П.1 надо делать прямо в hCertStore, который вернул PFXImportCertStore. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 Не помогло :( Может есть еще идеи?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,271
Сказал(а) «Спасибо»: 22 раз Поблагодарили: 446 раз в 325 постах
|
Вы слишком увлекаетесь copy-paste-ом. CryptSetProvParam(PP_KEYEXCHANGE_PIN) принимает строку. |
|
1 пользователь поблагодарил Русев Андрей за этот пост.
|
fenw оставлено 28.04.2021(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 17.06.2014(UTC) Сообщений: 19 Откуда: Москва Сказал(а) «Спасибо»: 5 раз
|
Вы правы, спасибо, взлетело
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close