Статус: Участник
  Группы: Участники
 Зарегистрирован: 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,556
  Сказал(а) «Спасибо»: 44 раз Поблагодарили: 650 раз в 448 постах
  
	 
	
     | 
    
        
            
		      
                Здравствуйте. Если я правильно вас понял, вы хотите импортировать без окон (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,556
  Сказал(а) «Спасибо»: 44 раз Поблагодарили: 650 раз в 448 постах
  
	 
	
     | 
    
        
            
		      
                Всё же я ставлю на то, что у вас ошибка в п.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,556
  Сказал(а) «Спасибо»: 44 раз Поблагодарили: 650 раз в 448 постах
  
	 
	
     | 
    
        
            
		      
                Да, примерно так. П.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,556
  Сказал(а) «Спасибо»: 44 раз Поблагодарили: 650 раз в 448 постах
  
	 
	
     | 
    
        
            
		      
                Вы слишком увлекаетесь 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