![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть такой код, который посылает запрос на удаленный сервер и получает от него ответ
Код:
http := TIdHTTP.Create(nil); //создание экземпляра протокола http
ssl := TIdSSLIOHandlerSocketOpenSSl.Create(http); //создание ssl на основе http
SSL.SSLOptions.RootCertFile :='1.pem'; //корневой сертификат
SSL.SSLOptions.CertFile := '2.crt'; //сертификат выданный нам центром сертификации//наш публичный ключ
SSL.SSLOptions.KeyFile := '3.key'; //наш приватный ключ
http.IOHandler := ssl;
HTTP.ProxyParams.ProxyServer:='...';
HTTP.ProxyParams.ProxyPort:=...;
try
try
params.Text := n;
responseres.Text := http.Post('https://...", params);
except
on E : Exception do
begin
ShowMessage('Ошибка! Заголовок ответа: ' + http.Response.RawHeaders.CommaText+'!'+e.Message);
end;
end;
finally
SSL.Free;
HTTP.Free;
end;При первом запуске программы код отрабатывает правильно, но при повторном обращении к серверу выдает ошибку could not load root certificate error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib Если программу перезапустить, то сначала отрабатывает снова нормально, а потом опять ошибка... Хотелось бы понять, в чем причина ошибки и как ее устранить. Delphi XE2 16.0.4429.46931 Последний раз редактировалось Admin, 01.09.2013 в 14:37. |
|
#2
|
||||
|
||||
|
Есть вероятность, что сертификат в не очень правильном формате. Попробуй сконвертировать его через openssl.
|
|
#3
|
|||
|
|||
|
Цитата:
|
|
#4
|
|||
|
|||
|
странный у вас форум... хотел постануть в подходящей теме, однако меня отбрили, так как тема якобы устарела. зашибись. вопрос по сертификатам, точнее получения одного свойства из сертификата:
нужен план получения нужного значения из сертификата, то есть цепочка команд друг за другом какие должны быть. преамбула: у сертификатов есть определенные политики применения. например - идентификация клиента на сервере - oid 1.3.6.1.5.5.7.3.2. они, насколько я понял, читаются из поля "улучшенный ключ командой CertGetEnhancedKeyUsage - она возвращает массив этих oid, которые имеются у этого сертификата. этот момент я написал и работает, я доволен. НО! в случае когда у сертификата стоит свойство - "Все политики применения", то фактически поле "улучшенный ключ" у сертификата отсутствует, и соответственно моя команда CertGetEnhancedKeyUsage не будет работать, возвращает 0 и все тут. вот собственно вопрос - каким образом мне получить свойство "Все политики применения"? какой порядок команд должен быть? сейчас: 1. CertOpenSystemStore - открываем нужное хранилище в системе, например мои личные сертификаты. 2. CertEnumCertificatesInStore - гоняем в цикле по хранилищу, получая каждый сертификат в отдельности 3. CertGetEnhancedKeyUsage - первый раз получаем размер массива 4. CertGetEnhancedKeyUsage - второй раз получаем уже сам массив 5. читаем этот массив гоняя в цикле количества элементов. 6. CertCloseStore - закрываем хранилище это краткий план получения oid 1.3.6.1.5.5.7.3.2 - "идентификация клиента на сервере", вот мне нужен точно такой-же, но для получения флага "Все политики применения". то есть что-то типа: 1. CertOpenSystemStore - открываем нужное хранилище в системе, например мои личные сертификаты. 2. CertEnumCertificatesInStore - гоняем в цикле по хранилищу, получая каждый сертификат в отдельности 3. CertGetEnhancedKeyUsage - если размер ноль, значит нужно искать "все политики" 4. блаблабла - эта самая команда для всех политик 5. CertCloseStore - закрываем хранилище |