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

Уведомление

Icon
Error

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

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.12.2008(UTC)
Сообщений: 8
Мужчина
Откуда: Ростов-на-Дону

Доброго времени суток.
Занимаюсь администрированием, но вот возникла задача написания программы для формирования запроса на выпуск сертификата и печати соответствующего заявления. Пишу на delphi 7. При помощи xenroll формирую запрос pksc#10. Однако никак не могу разобраться как вытащить из pksc#10 открытый ключ.
Буду признателен за помощь.
PS. Если у кого-то имеется описание функций xenroll, буду очень благодарен если вышлите на for_rsdn@mail.ru
Offline Kirill Sobolev  
#2 Оставлено : 22 декабря 2008 г. 15:24:57(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
вот тут есть аналогичная ситуация - http://www.cryptopro.ru/...ro/forum/view.asp?q=1324
описание функций xenroll есть в MSDN, http://msdn.microsoft.com/ru-ru/default.aspx
Техническую поддержку оказываем тут
Наша база знаний
Offline Artur_rnd  
#3 Оставлено : 23 декабря 2008 г. 1:22:30(UTC)
Artur_rnd

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.12.2008(UTC)
Сообщений: 8
Мужчина
Откуда: Ростов-на-Дону

Большое спасибо, буду пробовать
Offline Artur_rnd  
#4 Оставлено : 8 января 2009 г. 15:18:34(UTC)
Artur_rnd

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.12.2008(UTC)
Сообщений: 8
Мужчина
Откуда: Ростов-на-Дону

Пользуясь советами проделал следующее:

1. Создание ключевой пары и запроса на сертификат:
Код:

  var s: string;
  .....
  oEnroll:= CreateOLEObject('CEnroll.CEnroll.2'); 
  oEnroll.ProviderType := 75;
  oEnroll.ProviderName := 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider';
  oEnroll.ClientID := 0; 
  oEnroll.EnableSMIMECapabilities := False;
  oEnroll.KeySpec := 1; 
  oEnroll.GenKeyFlags := 0; 
  s:=oEnroll.createPKCS10('CN=Ivanov', '1.3.6.1.5.5.7.3.2');


Сформировался вот такой запрос:
Код:

MIICRDCCAfECAQAwETEPMA0GA1UEAxMGSXZhbm92MGMwHAYGKoUDAgITMBIGByqF
AwICJAAGByqFAwICHgEDQwAEQOw4Z3XQy7GgtLDEaVbLiMfu2tVuUO2ALcea69rD
wfh5O6FnZqIweM9pEiQwZNdqB9PUb4CwK6TDoLeN95xdQEygggFyMBoGCisGAQQB
gjcNAgMxDBYKNS4xLjI2MDAuMjA1BgorBgEEAYI3AgEOMScwJTAOBgNVHQ8BAf8E
BAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwggEbBgorBgEEAYI3DQICMYIBCzCC
AQcCAQEedgBDAHIAeQBwAHQAbwAtAFAAcgBvACAARwBPAFMAVAAgAFIAIAAzADQA
LgAxADAALQAyADAAMAAxACAAQwByAHkAcAB0AG8AZwByAGEAcABoAGkAYwAgAFMA
ZQByAHYAaQBjAGUAIABQAHIAbwB2AGkAZABlAHIDgYkAYi8S8VwjgMmPj5y0hubp
XT95lw8He//GfvwbW5yikmSG7U694CJKbix3DKSVpawYz9eNDkSko57Le+olE7gk
eHZg5CXUwqdKVvswjRk8b6xSudIwlOgUzMyJTXMgzO5hAFiu/Bokbo3/B4iaQr4n
4XHJsF930/4Rz/QAtc0rXFIAAAAAAAAAADAKBgYqhQMCAgMFAANBAIK9mLDIaXK8
Gy4SmlT7MyogWwmYcZcM/HT6ylW+05EL3B11FRegJUwph2375D6ibJ0y/OD1bjCS
zjmAgreFK1o=


Насколько я понимаю он в кодировке base64, и теперь, для того чтобы к нему применить функцию CryptDecodeObject его надо из base64 приобразовать в binary. Для этого я делаю следующее:
Код:

implementation
function CryptStringToBinary; external crypt32 name 'CryptStringToBinaryA';

.......

Flags := CRYPT_STRING_BASE64REQUESTHEADER;
CryptStringToBinary(pointer(s), Length(s), Flags, nil, sz, skip, Flags);
GetMem(buf, sz);
CryptStringToBinary(pointer(s), Length(s), Flags, buf, sz, skip, Flags);


Однако, получаю sz=0.

Подскажите в чём моя ошибка и как её можно исправить? Большое спасибо.




Offline Kirill Sobolev  
#5 Оставлено : 11 января 2009 г. 12:57:06(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
У вас base64 без заголовка, надо использовать флаг CRYPT_STRING_BASE64.
Техническую поддержку оказываем тут
Наша база знаний
Offline Artur_rnd  
#6 Оставлено : 12 января 2009 г. 1:26:01(UTC)
Artur_rnd

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.12.2008(UTC)
Сообщений: 8
Мужчина
Откуда: Ростов-на-Дону

Большое спасибо за совет.

написал следующий код:

Код:
Var
 ........
 s: string;
 Flags, sz: dword;
 reqB64: PBYTE;
 skip,rsize,req_info_len, key_len: DWORD;
 pCertReqInfo: PCERT_SIGNED_CONTENT_INFO;
 req_info: PCERT_REQUEST_INFO;
 subj: PCERT_NAME_BLOB;
 ps: PChar;

  .....

  Flags := CRYPT_STRING_BASE64;

  CryptStringToBinary(pchar(s), Length(s), Flags, nil, sz, skip, Flags);
  GetMem(reqB64, sz);
  CryptStringToBinary(pchar(s), Length(s), Flags, reqB64, sz, skip, Flags);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, X509_CERT, reqB64, sz, CRYPT_DECODE_NOCOPY_FLAG, nil, @rsize);

  GetMem(pCertReqInfo,rsize);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_CERT, reqB64,
                       sz,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       pCertReqInfo,
                       @rsize);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_CERT_REQUEST_TO_BE_SIGNED,
                       pCertReqInfo^.ToBeSigned.pbData,
                       pCertReqInfo^.ToBeSigned.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       nil,
                       @req_info_len);

  GetMem(req_info, req_info_len);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_CERT_REQUEST_TO_BE_SIGNED,
                       pCertReqInfo^.ToBeSigned.pbData,
                       pCertReqInfo^.ToBeSigned.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       req_info,
                       @req_info_len);


Проверил, что получаем в req_info следующим кодом

Код:


     subj:=@req_info^.Subject;
     CertNameToStr(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, subj, CERT_SIMPLE_NAME_STR,  ps, 512);
     


В ps содержиться строка вида "ivanov,test" (запрос созадавался при "CN=ivanov,O=test"). Вроде бы как отрабатывает правильно.
Далее, следуя советам из другой темы пытаюсь выполнить код:

Код:

CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_OCTET_STRING,
                       req_info^.SubjectPublicKeyInfo.PublicKey.pbData,
                       req_info^.SubjectPublicKeyInfo.PublicKey.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       nil,
                       @key_len);

При этом получаю key_len = 8. Для открытого ключа вробы как маловато.
Очень прошу Вас подсказать: Какой тип возвращает CryptDecodeObject при параметре X509_OCTET_STRING? Как из него получить строковое представление открытого ключ? Спасибо
Offline Kirill Sobolev  
#7 Оставлено : 12 января 2009 г. 15:25:33(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Декодировать ничего не надо, там уже лежит то что нужно.
А возвращает CRYPT_DATA_BLOB.
Техническую поддержку оказываем тут
Наша база знаний
Offline Artur_rnd  
#8 Оставлено : 13 января 2009 г. 1:52:57(UTC)
Artur_rnd

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.12.2008(UTC)
Сообщений: 8
Мужчина
Откуда: Ростов-на-Дону

Большое спасибо за советы. Всё получилось )
Offline Artur_rnd  
#9 Оставлено : 23 января 2009 г. 18:17:37(UTC)
Artur_rnd

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.12.2008(UTC)
Сообщений: 8
Мужчина
Откуда: Ростов-на-Дону

Теперь столкнулся со следующей проблемой - если в функцию createPKCS10 в первом парамете передать строку содержащую кавчки, то программа завершается с ошибкой. Например:
Код:

  oEnroll:= CreateOLEObject('CEnroll.CEnroll.2'); 
  oEnroll.createPKCS10('CN=Иванов,O=ООО "Тест" ', '1.3.6.1.5.5.7.3.2');

Прошу Вас подсказать каким образом можно обойти данное ограничение. Спасибо
Offline Kirill Sobolev  
#10 Оставлено : 23 января 2009 г. 18:29:52(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Их надо удваивать
s:=oEnroll.createPKCS10('CN=Иванов,O=ООО ""Тест""', '1.3.6.1.5.5.7.3.2');
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.