Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Andrew_Silver  
#1 Оставлено : 3 апреля 2008 г. 20:34:14(UTC)
Andrew_Silver

Статус: Участник

Группы: Участники
Зарегистрирован: 15.01.2008(UTC)
Сообщений: 18
Мужчина
Откуда: Пермь

Добрый день!

Почитал старый форум, но что-то понимание так и не пришло :)

Проблема следующая - пользователю дается eToken с закрытым ключом и сертификат соотвествующий этому ключу (отдельно, в файле).
Нужно как-то автоматизировать установку сертификата в систему,и корректно связать его с закрытым ключом.
Все это сделать нужно из коммандной строки фактически, так как предполагается что это будет делать некоторый инсталлер впоследствии.
Это возможно сделать?

P.S. Предполагается что криптопровайдер и драйвера eToken уже установлены и настроены
Offline Василий Лавочкин  
#2 Оставлено : 11 апреля 2008 г. 10:45:48(UTC)
Василий Лавочкин

Статус: Участник

Группы: Участники
Зарегистрирован: 04.04.2008(UTC)
Сообщений: 12

PCCERT_CONTEXT SetCertResponse(char* filename,bool *thisCertSet = NULL,HWND hWnd=NULL)
{
DWORD bytesReading;
char text[2048];
PCCERT_CONTEXT result = NULL;
HANDLE hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
ReadFile(hFile,text,sizeof(text),&bytesReading, NULL);
CloseHandle(hFile);
}
else return result;

CRYPT_KEY_PROV_INFO stProvInfo; /* Структура передачи ссылки открытого ключа на секретный ключ.*/
PCCERT_CONTEXT pUserCert = NULL;
HCERTSTORE hCertStore = NULL;

pUserCert = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,text,bytesReading);

//Тип ключа сертификата
DWORD dwKeySpec = (GET_ALG_CLASS(CertOIDToAlgId(pUserCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId)) == ALG_CLASS_SIGNATURE)? AT_SIGNATURE : AT_KEYEXCHANGE;


//Привяжем сертификат к контейнеру ключа
HCRYPTPROV hProv = NULL;
DWORD typeProv = 75;
static char* nameContainer = NULL;
char* sz;
DWORD szLength;
bool CorrectKey = false; //Если ключи верны
bool CorrectContainer = false; //Если контейнер найден

ZeroMemory(&stProvInfo,sizeof(stProvInfo));

szLength = CertGetNameString(pUserCert,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,szOID_COMMON_NAME,nameContainer,0);
if(szLength>0)
{
nameContainer = (char*) LocalAlloc(LMEM_FIXED,szLength);
if(nameContainer)
CertGetNameString(pUserCert,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,szOID_COMMON_NAME,nameContainer,szLength);
}


if(hWnd) CryptSetProvParam(0,PP_CLIENT_HWND,(BYTE*)&hWnd,0);
Offline Василий Лавочкин  
#3 Оставлено : 11 апреля 2008 г. 10:47:09(UTC)
Василий Лавочкин

Статус: Участник

Группы: Участники
Зарегистрирован: 04.04.2008(UTC)
Сообщений: 12

if(CryptAcquireContext(&hProv,nameContainer,NULL,typeProv,0))
{
CorrectContainer = (hProv);
if(CryptGetProvParam(hProv, PP_NAME, NULL, &szLength, 0))
{
sz = (char*) LocalAlloc(LMEM_FIXED,szLength);
CryptGetProvParam(hProv,PP_NAME,(BYTE*)sz,&szLength,0);
stProvInfo.pwszProvName = (wchar_t*) LocalAlloc(LMEM_FIXED,szLength * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,sz,-1,stProvInfo.pwszProvName,szLength);
LocalFree((HLOCAL)sz);
}

if(CryptGetProvParam(hProv,PP_UNIQUE_CONTAINER, NULL, &szLength, 0))
{
sz = (char*) LocalAlloc(LMEM_FIXED,szLength);
CryptGetProvParam(hProv,PP_UNIQUE_CONTAINER,(BYTE*)sz,&szLength,0);
stProvInfo.pwszContainerName = (wchar_t*) LocalAlloc(LMEM_FIXED,szLength * sizeof (wchar_t));
MultiByteToWideChar(CP_ACP,0,sz,-1,stProvInfo.pwszContainerName,szLength);
LocalFree((HLOCAL)sz);
}
Offline Василий Лавочкин  
#4 Оставлено : 11 апреля 2008 г. 10:48:10(UTC)
Василий Лавочкин

Статус: Участник

Группы: Участники
Зарегистрирован: 04.04.2008(UTC)
Сообщений: 12

//Проверим соответствие ключей

CERT_PUBLIC_KEY_INFO* pKeyPublic = NULL;
szLength = 0 ;
if(CryptExportPublicKeyInfo(hProv,dwKeySpec,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,NULL,&szLength))
{
if(szLength>0)
{
pKeyPublic = (CERT_PUBLIC_KEY_INFO*) LocalAlloc(LMEM_FIXED,szLength);
if(pKeyPublic)
{
Offline Василий Лавочкин  
#5 Оставлено : 11 апреля 2008 г. 10:52:45(UTC)
Василий Лавочкин

Статус: Участник

Группы: Участники
Зарегистрирован: 04.04.2008(UTC)
Сообщений: 12

if(CryptExportPublicKeyInfo(hProv,dwKeySpec,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,pKeyPublic,&szLength))
{
if( (pKeyPublic->PublicKey.cbData==pUserCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData) &&
(pKeyPublic->PublicKey.cUnusedBits==pUserCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cUnusedBits) )
{
int i=0;
int len = pKeyPublic->PublicKey.cbData;
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.