Форум КриптоПро
	 » 
	Устаревшие продукты
	 » 
	КриптоПро CSP 3.6
	 » 
	Не работает сброс свойства CERT_KEY_CONTEXT_PROP_ID у сертификата.
	 
	
        
            
            
    | 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 15.09.2010(UTC) Сообщений: 19  Откуда: Москва | 
            
		      
                Использую флаг CRYPT_ACQUIRE_CACHE_FLAG для кэширования провайдера и ключей.  Но по истечению таймаута пытаюсь сбросить установленное свойство.  Но получение провайдера при помощи CryptAcquireCertificatePrivateKey проходит успешно,  даже если вынут контейнер с ключами, т.е. кэш не очищается Код:        // Проверяем нужно ли убрать из кэша провайдер
        if (::GetTickCount() - lastTick > config.GetLastOperationKeyTimeout()*1000)
            // Убираем закэшированный провайдер из сертификата
            if (!::CertSetCertificateContextProperty(SignerCert.GetContext(), 
                CERT_KEY_CONTEXT_PROP_ID, 0, 0))
                throw WinApiException();
        DWORD dwFlags = CRYPT_ACQUIRE_CACHE_FLAG; // кэшируем        
        BOOL fCallerFreeProv;
        if (!::CryptAcquireCertificatePrivateKey(SignerCert.GetContext(),
            /* сверяем открытый ключ с ключом сертификата */CRYPT_ACQUIRE_COMPARE_KEY_FLAG |
            dwFlags, 0, &hProv, &dwKeySpec, &fCallerFreeProv))
        {
           // Пробуем другой способ получить провайдер
           ...
        }
        // При повторном вызове ошибки не будет даже если таймаут исчез и контейнер вынут
 Что неправильно? Заранее спасибо. Отредактировано пользователем 15 сентября 2010 г. 7:13:24(UTC)
 | Причина: Не указана | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 | 
            
		      
                Кроме кэша в CryptoAPI, есть еще кэширование контекстов в криптопровайдере. Если оно специально не включено (сервис и чекбокс в панели управления), то контейнер в кэше до закрытия последнего контекста с ним. | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 15.09.2010(UTC) Сообщений: 19  Откуда: Москва | 
            
		      
                maxdm написал:Кроме кэша в CryptoAPI, есть еще кэширование контекстов в криптопровайдере. Если оно специально не включено (сервис и чекбокс в панели управления), то контейнер в кэше до закрытия последнего контекста с ним. Кэширование контекстов в криптопровайдере специально не включал. Откуда тогда CryptAcquireCertificatePrivateKey берет закешированный провайдер, если свойство CERT_KEY_CONTEXT_PROP_ID сбрасывается?  То есть получается, что если провайдер, который был асоциирован с сертификатом не освободился, то он всеравно как-то находится ф-цией CryptAcquireCertificatePrivateKey, несмотря на сброс CERT_KEY_CONTEXT_PROP_ID? Если так, то это очень плохо и  как избежать данной ситуации? | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 | 
            
		      
                закрывать открытый CryptAcquireCertificatePrivateKey контекст. | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 15.09.2010(UTC) Сообщений: 19  Откуда: Москва | 
            
		      
                maxdm написал:закрывать открытый CryptAcquireCertificatePrivateKey контекст. К сожалению ваши ответы для меня ситуацию не прояснили. Итак  1) CryptAcquireCertificatePrivateKey вызывается с флагом CRYPT_ACQUIRE_CACHE_FLAG и возвращает out параметр fCallerFreeProv == FALSE, что означает, что вызывающая сторона не должна освобождать провайдер. Разве сброс свойства CERT_KEY_CONTEXT_PROP_ID перед следующим вызовом CryptAcquireCertificatePrivateKey  не освобождает закэшированный провайдер? Как тогда его закрывать? 2) Из ваших слов я понял, что даже если провайдер был получен ранее для этого сертификата, то при вызове еще одного  CryptAcquireCertificatePrivateKey возвращается первый провайдер с закэшированными ключами. Это так? Если да, то такое поведение свойственено только криптопро? В документации MSDN написано только про кэширование в CERT_KEY_CONTEXT_PROP_ID и больше не говорится о неявном кэше провайдера. | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 | 
            
		      
                Я все написал в первом ответе. CERT_KEY_CONTEXT_PROP_ID не имеет никакого отношения к кэшу контейнеров  - это API верхнего уровня. | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 15.09.2010(UTC) Сообщений: 19  Откуда: Москва | 
            
		      
                maxdm написал:Я все написал в первом ответе. CERT_KEY_CONTEXT_PROP_ID не имеет никакого отношения к кэшу контейнеров  - это API верхнего уровня. Я попробую еще раз. В самом простом случае не работает  CryptAcquireCertificatePrivateKey вызывается с флагом CRYPT_ACQUIRE_CACHE_FLAG и возвращает out параметр fCallerFreeProv == FALSE, что означает, что вызывающая сторона не должна освобождать провайдер. (из МСДН) Я его и не закрываю. Но по истечению таймаута мне нужно, чтобы кэш пропал. Я его пытаюсь сбросить установкой свойства CERT_KEY_CONTEXT_PROP_ID, но не получается.  Каким способом, тогда мне закрыть провайдер? Вытащить из сертификата и явно закрыть?  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 | 
            
		      
                Про pfCallerFreeProvOrNCryptKey был неправ. Для удаления из кэша достаточно закрыть контекст сертификата - все по тому же MSDN. Отредактировано пользователем 16 сентября 2010 г. 12:51:55(UTC)
 | Причина: Не указана | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 | 
            
		      
                Провел эксперимент - освобождения контекста сертификата недостаточно - нужно закрывать хранилище, содержащее сертификат. Так что MSDN обманывает, во всяком случае на Win 7
 | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 15.09.2010(UTC) Сообщений: 19  Откуда: Москва | 
            
		      
                У меня не используется хранилище для сертификатов. Он создается в памяти (читается из базы данных) и контекст сохраняется в течении жизни программы. Но пока освобождение контекста сертификата еще не пробовал. Но даже если это и будет работать, чтобы прекратить кэширование придется освободить контекст и создать сертификат заново. Еще экспериментировал со свойством CERT_KEY_PROV_HANDLE_PROP_ID, при сбросе которого МСДН обещает освободить закэшированного провайдера, но ничего не вышло.Если можно, еще два вопроса:
 1) CryptAcquireCertificatePrivateKey возвращает мне каждый раз разный хэндл провайдера. Означает ли это что объект провайдера действительно разный и проблема не из-за того, что каждый раз используется закэшированный провайдер, а из-за того, что крипто-про кэширует ключевой контейнер, так как виндоуз не закрыл закэшированный по началу провайдер.
 
 2) Есть ли возможность изменить поведение крипто-про, чтобы он перестал кэшировать ключевой контейнер глобально, а скажем кэшировал в рамках только одного экземпляра провайдера? Ведь ошибка в коде или в крипто-апи виндоуз, вызывающая утечку провайдера, ведет к большой дыре в безопасности. Так пользователь может вынуть ключевой контейнер и отойти от рабочего места, а в это время кто угодно может подписать за него документы.
 | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
	                           
	Форум КриптоПро
	 » 
	Устаревшие продукты
	 » 
	КриптоПро CSP 3.6
	 » 
	Не работает сброс свойства CERT_KEY_CONTEXT_PROP_ID у сертификата.
	 
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close