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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Invoclass  
#1 Оставлено : 6 марта 2009 г. 17:15:08(UTC)
Invoclass

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

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

ПОЖАЛУЙСТА, ПОМОГИТЕ СОВЕТОМ!!!
Пытаюсь создать файл с цепочкой сертификатов в PKCS #7, но что-то CertSaveStore возвращает FALSE (естественно, ничего не сохраняя...).
Причем, если я указываю вместо CERT_STORE_SAVE_TO_FILE сохранение в память CERT_STORE_SAVE_TO_MEMORY, то тогда CertSaveStore отрабатывается правильно и возвращается TRUE...

Вот, привожу краткую выдержку кода Delphi:

var

path_p7b: String;
encType, encCertLen: DWORD;
encCert: PByte;
hMyFile: THandle
hMyStore: HCERTSTORE;
pcert_context, ppStoreContext: PCCERT_CONTEXT;
provCA: HCRYPTPROV;
cont: PChar;
Result: Boolean;

begin

cont := nil;
encType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;

...

CryptAcquireContext(@provCA, cont, CP_GR3410_2001_PROV_A,PROV_GOST_2001_DH, 0));

...

CryptSignAndEncodeCertificate(provCA, AT_SIGNATURE, encType, X509_CERT_TO_BE_SIGNED, @certInfo, @(certInfo.SignatureAlgorithm), nil, nil, @encCertLen);
GetMem(encCert, encCertLen);
CryptSignAndEncodeCertificate(provCA, AT_SIGNATURE, encType, X509_CERT_TO_BE_SIGNED, @certInfo, @(certInfo.SignatureAlgorithm), nil, encCert, @encCertLen);

...

path_p7b:='cert.p7b';
hMyFile := CreateFile(PCHAR(path_p7b) ,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0);
hMyStore := CertOpenStore( CERT_STORE_PROV_MEMORY, PKCS_7_ASN_ENCODING,ProvCA,CERT_STORE_OPEN_EXISTING_FLAG, 0);
pcert_context := CertCreateCertificateContext(encType, encCert, encCertLen);
ppStoreContext := nil;
CertAddCertificateContextToStore(hMyStore,pcert_context, CERT_STORE_ADD_REPLACE_EXISTING, ppStoreContext);
Result := CertSaveStore(hStore,encType, CERT_STORE_SAVE_AS_PKCS7, CERT_STORE_SAVE_TO_FILE, @hMyFile, 0);
If Not Result Then begin MessageDlg('Error', MtError, [MbOk], 0); Exit; end;

end;

Почему Result возвращает FALSE? Что я делаю не так?...

Заранее спасибо за помощь!
Offline Kirill Sobolev  
#2 Оставлено : 6 марта 2009 г. 18:55:36(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
В MSVC HANDLE это тоже самое что и void*. Что такое THandle в delphi и какой смысл несет операция @hMyFile?
GetLastError что говорит?
Техническую поддержку оказываем тут
Наша база знаний
Offline Invoclass  
#3 Оставлено : 6 марта 2009 г. 20:12:32(UTC)
Invoclass

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

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

Kirill Sobolev написал:
В MSVC HANDLE это тоже самое что и void*. Что такое THandle в delphi и какой смысл несет операция @hMyFile?
GetLastError что говорит?


В Delphi тип данных THANDLE = INTEGER (целочисленный тип данных).
@hMyFile - это адрес переменной hMyFile.

Удивительно, что GetLastError после CertSaveStore возращает 0, но создавшийся файл имеет нулевую лину, да и сам CertSaveStore возвращает значение FALSE...

Отредактировано пользователем 6 марта 2009 г. 20:40:04(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#4 Оставлено : 6 марта 2009 г. 20:37:35(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
А вообще что-нибудь в создаваемый файл можно записать, например при помощи WriteFile?
Техническую поддержку оказываем тут
Наша база знаний
Offline Invoclass  
#5 Оставлено : 6 марта 2009 г. 20:40:38(UTC)
Invoclass

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

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

Kirill Sobolev написал:
А вообще что-нибудь в создаваемый файл можно записать, например при помощи WriteFile?


Записать можно! Пробовал просто записать в файл сам сертификат в der - пишется... Think а p7b не создается Brick wall Brick wall Brick wall

Кстати, GetLastError почему-то после CertAddCertificateContextToStore возвращает код ошибки: 2148081668
Я так понимаю, что это означает проблему с сертифкатом? ...если да, то какую?
Дело в точ, что перед созданием цепочки сертификатов я подписанный сертификат записываю в файл следующим образом:
AssignFile(f, path_in); rewrite(f, 1); BlockWrite(f, encCert^, encCertLen); CloseFile(f);
- в результате у меня создается самоподписанный корневой сертификат в DER-кодировке.

Вот, на всякий случай, сам сертифкат в PEM формате:

-----BEGIN CERTIFICATE-----
MIIBojCCAU+gAwIBAgIDYIaiMAoGBiqFAwICBAUAMBQxEjAQBgNVBAMTCUludm9j
bGFzczAeFw0wODEyMDExNDM1MDdaFw0wOTEyMDExNDM1MDdaMBQxEjAQBgNVBAMT
CUludm9jbGFzczBjMBwGBiqFAwICEzASBgcqhQMCAiMBBgcqhQMCAh4BA0MABEAz
O3YHfsNLYYq07mxKrcIsTtrWABKs+k8EFuS10Da1N9bmbjcS+CmFqoI6CBIBINWc
cIqxC+dmHe7h3yEE3ooeo4GFMIGCMAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUi10F
ohcrZjnRyvPDRIwtoNt636UwEAYJKwYBBAGCNxUBBAMCAQAwMQYDVR0lBCowKAYI
KwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDAwYIKwYBBQUHAwQwDwYDVR0TAQH/
BAUwAwEB/zAKBgYqhQMCAgQFAANBAEjOWMQlPmS1at3d/WUhN5/htPBNgfMg0IMj
XZNxRfXlDRBAbDPJYNHaJlxcB1aYQR04jmzg4sh11NYnAtDD8Ec=
-----END CERTIFICATE-----

Отредактировано пользователем 9 марта 2009 г. 6:24:55(UTC)  | Причина: Не указана

Offline Invoclass  
#6 Оставлено : 9 марта 2009 г. 6:22:06(UTC)
Invoclass

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

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

Ну так что, в чем же пролблема? Неправильный код формирования p7b-цепочки сертификатов, или еще что?... Think

Отредактировано пользователем 10 марта 2009 г. 15:20:42(UTC)  | Причина: Не указана

Offline Invoclass  
#7 Оставлено : 10 марта 2009 г. 15:11:41(UTC)
Invoclass

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

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

УРА!!! Я разобрался, где грабли зарыты! d'oh!
Вот, написал правильный код:

hMyStore := CertOpenStore( CERT_STORE_PROV_MEMORY, encType,provCA,CERT_STORE_CREATE_NEW_FLAG, 0);
pcert_context := CertCreateCertificateContext(encType, encCert, encCertLen);
CertAddCertificateContextToStore(hMyStore,pcert_context, CERT_STORE_ADD_ALWAYS, ppStoreContext);
Result := CertSaveStore(hMyStore,encType, CERT_STORE_SAVE_AS_PKCS7, CERT_STORE_SAVE_TO_FILENAME_A, PAnsiCHAR(path_p7b), 0);

А ЛАРЧИК ПРОСТО ОТКРЫВАЛСЯ!!!!! ;~)

Отредактировано пользователем 10 марта 2009 г. 15:45:26(UTC)  | Причина: Не указана

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