| ||||
| ||||
Можно ли сделав ключевую пару для подписи на одной машине (дискета), передать ее (дискету) для использования с другой машины. При попытке получить контекст CryptAcquireContext, где в качестве имени контейнера ввожу имя контейнера на дискете выскакивает окошко с просьбой вставить чистый носитель. Проясните ситуацию. | ||||
Ответы: | ||||
| ||||
Вышел из положения передав соответствующую ветку реестра на другой компьютер. Не решается ли это как нибудь получше? | ||||
| ||||
1. С каким флпгом вызываете CryptAcquireContext ? 2. Какая версия СSP ? | ||||
| ||||
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; } | ||||
| ||||
Всё понятно. При первом вызове AcquireContext с именем контейнера используется флажок CRYPT_NEWKEYSET. Это и означает, что будет попытка создать новый контейнер на дискете. Чтобы этого не случилось, нужно поменять местами вызовы (CryptAcquireContext( &phProv, pszContainer, pszProvider, 71, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET )) и (CryptAcquireContext( &phProv, pszContainer, pszProvider, 71, CRYPT_MACHINE_KEYSET )) | ||||