11.09.2003 13:26:16Передача ключевой пары Ответов: 4
Андрей Сошин
Можно ли сделав ключевую пару для подписи на одной машине (дискета), передать ее (дискету) для использования с другой машины.
При попытке получить контекст CryptAcquireContext, где в качестве имени контейнера ввожу имя контейнера на дискете выскакивает окошко с просьбой вставить чистый носитель.
Проясните ситуацию.
 
Ответы:
11.09.2003 17:02:52Андрей Сошин
Вышел из положения передав соответствующую ветку реестра на другой компьютер.
Не решается ли это как нибудь получше?
12.09.2003 11:23:35Василий
1. С каким флпгом вызываете CryptAcquireContext ?
2. Какая версия СSP ?
12.09.2003 12:19:20Андрей Сошин
CSP 2.0

Вот кусок исходника

ECryptoClientErrors CCryptoClient::GetHandleCSP(LPCTSTR pszContainer, LPCTSTR pszProvider)
{
int nError;
if (pszContainer == NULL){
if (CryptAcquireContext(
&phProv,
NULL,
pszProvider,
71,
CRYPT_VERIFYCONTEXT
))
return CC_NOERRORS;
else
return CC_NOACCESS_CONTEXT;
}
// Если контейнера для провайдера нет, то он создается и возвращается контекст
if (CryptAcquireContext(
&phProv,
pszContainer,
pszProvider,
71,
CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET
))
return CC_NOERRORS;
nError = GetLastError();
// Если контейнер есть, то получаем контекст
if (nError == NTE_EXISTS){
if (CryptAcquireContext(
&phProv,
pszContainer,
pszProvider,
71,
CRYPT_MACHINE_KEYSET
))
return CC_NOERRORS;
else
return CC_NOACCESS_CONTEXT;
}
return CC_NOACCESS_CONTEXT;
}
12.09.2003 15:14:36Василий
Всё понятно. При первом вызове AcquireContext с именем контейнера используется флажок CRYPT_NEWKEYSET.
Это и означает, что будет попытка создать новый контейнер на дискете.
Чтобы этого не случилось, нужно поменять местами вызовы
(CryptAcquireContext(
&phProv,
pszContainer,
pszProvider,
71,
CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET
))
и
(CryptAcquireContext(
&phProv,
pszContainer,
pszProvider,
71,
CRYPT_MACHINE_KEYSET
))