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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline VaXoID  
#1 Оставлено : 6 апреля 2008 г. 17:29:05(UTC)
VaXoID

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

Группы: Участники
Зарегистрирован: 29.02.2008(UTC)
Сообщений: 2
Откуда: Омск

День добрый. Использую WinAPI Crypt2.
Создал самоподписанный сертификат и экспериментировал на нем. Сертификат находился в хранилище Windows и успешно подписывал сообщения. Любой почтовый клиент мог его проверить на не изменяемость. Но пришла наконец лицензия на КриптоПро 3.0 и ключ созданный по ГОСТ Р 34.11/34.10-2001.
Установил КриптоПро 3.0 ключевым контейнером являлась дискета. Сертификат ипортирован в хранилизе "Личные" ("MY"). Для подписи использую высокоуровневые функции CryptSignMessage. Но при использовании сертификата ГОСТ почтовые клиенты (TheBat и Outlook exp говорят что ЭЦП не верна...КриптоПро конечно установлен). Привожу листинг кода подписания блока письма (создание "smime.p7s").
К дискете как и положено 2 обращения, но возвращаемая длина Sign = 2828, при том что подписы TheBat = 2988.
Прошу помощи, т.к. уже все перечитал...понимаю что тут где-то маленькая загвоздка, но никак не соображу((.

Код:
function SignMessage(MessageToSign: String; var Sign: String): Boolean;
var
  CerType             : Cardinal;
  CERT_STORE_NAME,
  SIGNER_NAME         : PWideChar;
  hStoreHandle        : HCERTSTORE;
  pSignerCert         : PCCERT_CONTEXT;
  SigParams           : CRYPT_SIGN_MESSAGE_PARA;
  sData, signature    : PByte;
  data                : array[0..0] of PByte;
  dwDataSizeArray     : array[0..0] of DWORD;
  cbSignedBlob        : DWORD;
  EMime               : TIdEncoderMIME;
  ini                 : TIniFile;
  Store,SigNM         : String;
  hProv               : HCRYPTPROV;
  err, PassStr        : String;
  pass                : PByte;
begin
try
ini := TIniFile.Create(FileIni);
CerType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
//// Наименование персонального хранилища
Store:= ini.ReadString('Certificate','Store','');  // Store=FAT12\F0ADF00A\55060647.000\A181
SigNM:= ini.ReadString('Certificate','Owner_Cert_Sign','');
PassStr:=ini.ReadString('Certificate','Pass','');
ini.Free;
GetMem(SIGNER_NAME,(Length(SigNM)+1)*2);
GetMem(CERT_STORE_NAME,(Length(Store)+1)*2);
SIGNER_NAME:=StringToWideChar(SigNM,SIGNER_NAME,Length(SigNM)+1);
CERT_STORE_NAME:=StringToWideChar(Store,CERT_STORE_NAME,Length(Store)+1);

CryptAcquireContext(@hProv, PAnsiChar(Store),'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider', 75, 0) // все проходит без ошибок
pass := @PassStr[1];  

//Пароль доступа к хранилищю, тож отрабатывает на ура.
CryptSetProvParam(
   hProv,
   PP_KEYEXCHANGE_PIN,
   pass,
   0)

hStoreHandle := CertOpenSystemStore(hProv,'MY');

// Получаем указатель на наш сертификат, всё находит.
pSignerCert:=CertFindCertificateInStore(
   hStoreHandle,
   CerType,
   0,
   CERT_FIND_SUBJECT_STR,
   SIGNER_NAME,
   nil);

// Подписываем
  GetMem(sData, Length(MessageToSign));
  system.Move(Pointer(MessageToSign)^, sData^, Length(MessageToSign));
  ZeroMemory(@sigParams, SizeOf(CRYPT_SIGN_MESSAGE_PARA));
    //Параметры полей сертификата подписи
    SigParams.cbSize := SizeOf(CRYPT_SIGN_MESSAGE_PARA);
    SigParams.dwMsgEncodingType := CerType;
    SigParams.pSigningCert := pSignerCert;
    SigParams.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411;  // szOID_CP_GOST_R3411 = '1.2.643.2.2.9'
    SigParams.HashAlgorithm.Parameters.cbData := 0;
    SigParams.cMsgCert := 0;
    SigParams.rgpMsgCert := nil;
    SigParams.cMsgCrl := 0;
    SigParams.cAuthAttr := 0;
    SigParams.dwInnerContentType := 0;
    SigParams.cMsgCrl := 0;
    SigParams.cUnauthAttr := 0;
    SigParams.dwFlags := 0;
    SigParams.pvHashAuxInfo := nil;
    SigParams.rgAuthAttr := nil;
  data[0] := sData;
  dwDataSizeArray[0] := Length(MessageToSign);
  cbSignedBlob := 0;

CryptSignMessage(@sigParams,
                            False, 
                            1, 
                            @data[0], 
                            @dwDataSizeArray[0],
                            nil, 
                            @cbSignedBlob);  //cbSignedBlob получаем равным 2136
  GetMem(signature, cbSignedBlob);

CryptSignMessage(@sigParams, 
                            False, 
                            1, 
                            @data[0], 
                            @dwDataSizeArray[0],
                            signature, 
                            @cbSignedBlob); //cbSignedBlob получаем равным 2120    - Так и должно быть???
    SetLength(Sign, cbSignedBlob);
    system.Move(signature^, Pointer(Sign)^, cbSignedBlob);
    EMime:=TIdEncoderMIME.Create(Self);
    EMime.FillChar:='=';
    Sign:=EMime.Encode(Sign);
    EMime.Free;
    FreeMem(signature);

FreeMem(sData);
FreeMem(CERT_STORE_NAME);
FreeMem(SIGNER_NAME);
Result:=True;
// Освобождаем контекст
CertFreeCertificateContext(pSignerCert);

// Закрываем хранилище
CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG) 
end;


Получаемое значение ЭЦП немного странное, т.е. в нем встречаются повторяющиеся блоки:
Код:
MIIIRAYJKoZIhvcNAQcCoIIINTCCCDECAQExDDAKBgYqhQMCAgkFADCCBwYGCSqGSIb3DQEH
AaCCBvcEggbzQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7DQogYm91bmRhcnk9Ij1f
..............................................................................................................................
IGZpbGVuYW1lPSJSZWVzdHJfMjAwOF9ZZWFyXzRfTW9udGhfNl9EQVlfMC5kYmYiDQoNCkEy
d0VCZ0FBQUFCQ0ErSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUJKVGtSZlRrVlhBQUFB
QUVNQkFBQUFCUUFBQUFBQQoNQUFBQUFBQUFBQUFBQUU1UFRWOU1TVU1BQUFBQVF3WUFBQUFJ
QUFBQUFBQUFBQUFBQUFBQUFBQUFVa0ZPUjBVQUFBQUFBQUJECg1EZ0FBQUFRQUFBQUFBQUFB
QUFBQUFBQUFBQUJFUVZSQlgxQUFBQUFBQUVRU0FBQUFDQUFBQUFBQUFBQUFBQUFBQUFBQUFG
QlMKDVQwTkVRVlJGQUFBQVJCb0FBQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFUbDlQVXdBQUFB
QUFBQUJESWdBQUFBTUFBQUFBQUFBQQoNQUFBQUFBQUFBQUJPWDB0QlUxTUFBQUFBQUVNbEFB
QUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFFNWZTMVpKVkFBQUFBQUFReVlBCg1BQUFFQUFBQUFB
QUFBQUFBQUFBQUFBQUFVRTlMUVZveEFBQUFBQUJPS2dBQUFBZ0NBQUFBQUFBQUFBQUFBQUFB
QUFCUVQwdEIKDVdqSUFBQUFBQUU0eUFBQUFDQUlBQUFBQUFBQUFBQUFBQUFBQUFGQlBTMEZh
TXdBQUFBQUFUam9BQUFBSUFnQUFBQUFBQUFBQQoNQUFBQUFBQUFVRTlMUVZvMEFBQUFBQUJP
UWdBQUFBZ0NBQUFBQUFBQUFBQUFBQUFBQUFCUVQwdEJXalVBQUFBQUFFNUtBQUFBCg1DQUlB
QUFBQUFBQUFBQUFBQUFBQUFFUkJWRjlRVDB0QldnQUFSRklBQUFBSUFBQUFBQUFBQUFBQUFB
QUFBQUFBVTFWTlRVRXgKDUFBQUFBQUJPV2dBQUFBd0NBQUFBQUFBQUFBQUFBQUFBQUFCVFZV
MU5RVElBQUFBQUFFNW1BQUFBREFJQUFBQUFBQUFBQUFBQQoNQUFBQUFGTlZUVTFCTXdBQUFB
QUFUbklBQUFBTUFnQUFBQUFBQUFBQUFBQUFBQUFBVTFWTlRVRTBBQUFBQUFCT2ZnQUFBQXdD
Cg1BQUFBQUFBQUFBQUFBQUFBQUFCVFZVMU5RVFVBQUFBQUFFNktBQUFBREFJQUFBQUFBQUFB
QUFBQUFBQUFBRk5WVFUxQk5nQUEKDUFBQUFUcFlBQUFBTUFnQUFBQUFBQUFBQUFBQUFBQUFB
VTFWTlRVRTNBQUFBQUFCT29nQUFBQXdDQUFBQUFBQUFBQUFBQUFBQQoNQUFCVFZVMU5RVGdB
QUFBQUFFNnVBQUFBREFJQUFBQUFBQUFBQUFBQUFBQUFBRk5WVFUxQk9RQUFBQUFBVHJvQUFB
QU1BZ0FBCg1BQUFBQUFBQUFBQUFBQUFBVTFWTlRVRXhNQUFBQUFCT3hnQUFBQXdDQUFBQUFB
QUFBQUFBQUFBQUFBQkpSRkJCV1FBQUFBQUEKDUFFUFNBQUFBRUFBQUFBQUFBQUFBQUFBQUFB
dTELMAkGA1UEBhMCUlUxITAfBgNVBAcMGNCV0LrQsNGC0LXRgNC40L3QsdGD0YDQszEuMCwG
A1UECgwl0JfQkNCeIMKr0J/QpCDCq9Ch0JrQkSDQmtC+0L3RgtGD0YDCuzEdMBsGA1UEAxMU
BQAEQIwggLglMwsunBxzFUwYoEO8FOuEVFvVhb3LMk40CiYf6sv7ISk54Xx5/jiajjKuyw1c
IEP/BUGhqiomE3zfjTk

Отредактировано пользователем 7 апреля 2008 г. 15:34:28(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#2 Оставлено : 7 апреля 2008 г. 14:43:27(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
А можно еще сертификат, которым подписываете?
Техническую поддержку оказываем тут
Наша база знаний
Offline VaXoID  
#3 Оставлено : 7 апреля 2008 г. 15:38:47(UTC)
VaXoID

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

Группы: Участники
Зарегистрирован: 29.02.2008(UTC)
Сообщений: 2
Откуда: Омск

Kirill Sobolev написал:
А можно еще сертификат, которым подписываете?

Я так понимаю что переборщил выложив полностью подпись((.. поправил...
А есть мысли по вопросу?
Offline Kirill Sobolev  
#4 Оставлено : 7 апреля 2008 г. 15:54:34(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Нет, Вы неправильно понимаете.
Одного кода, тем более на паскале и подписи недостаточно для оценки результатов - еще нужен сертификат, которым эту подпись можно проверить.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.