Отправка https-запроса с использованием Synapse

rubi
Дата: 16.05.2011 00:52:54
Необходимо отправить запрос на удаленный сервер и получить от него ответ. Запрос должен быть https. Использую Delphi 2009 и Synapse. Имеется сертификат (pem). Вот код, который получился:

procedure TForm1.Button3Click(Sender: TObject);
var
  HTTP: THTTPSend;
  Socket: TTCPBlockSocket;
begin
  HTTP := THTTPSend.Create;
  try 
    Socket := http.Sock.Create;
    Socket.CloseSocket;
    Socket.SSL.CertificateFile := 'ssl_cert.pem';
    Socket.SSL.PrivateKeyFile := 'ssl_cert.pem';
    Socket.SSL.CertCAFile := 'ssl_cert.pem';

    Socket.Connect('https://myservice.ru', '8443');

    Socket.SSLDoConnect;

    HTTP.HTTPMethod('POST', 'https://myservice.ru:8443/cnt?id=100');
    Memo1.Lines.Assign(HTTP.Headers);
    Memo2.Lines.LoadFromStream(HTTP.Document);
  finally
    HTTP.Free;
  end;

В результате в Memo2 либо пусто, либо бывает код страницы с ошибкой 404. Кстати говоря, начинает показывать 404-ю, когда убираешь следующий блок:
    Socket.SSL.CertificateFile := 'ssl_cert.pem';
    Socket.SSL.PrivateKeyFile := 'ssl_cert.pem';
    Socket.SSL.CertCAFile := 'ssl_cert.pem';

Вопрос в том, как правильно написать клиента, который будет отсылать https-запрос с использованием pem-файла? Вообще, чаще всего в интернете натыкался на статьи, которые либо описывают, как создать сервер с использованием https, либо как пройти авторизацию с использованием https - но при этом не нужно использовать файл pem.

Может быть, нужно использовать свойство Socket.SSL.Password для валидации сертификата на сервере??? Кстати говоря, посмотрел при отладке свойства HTTP (это который THTTPSend), у него ResultCode 500 - как я понимаю, ошибка сервера. По сути, то же самое происходит, если вбить адрес в браузер, пишет:

SSL-узел не может верифицировать ваш сертификат.

(Код ошибки: ssl_error_bad_cert_alert)

Поэтому подозрения, что как-то неправильно прикрепляю pem-файл.
rubi
Дата: 16.05.2011 14:15:37
Может кто-то встречал пример, где устанавливается https-соединение (SSL), а далее идет обмен сообщениями???
fd00ch
Дата: 16.05.2011 14:41:36
rubi
Может кто-то встречал пример, где устанавливается https-соединение (SSL), а далее идет обмен сообщениями???
Там всё просто: подключаешь в свой проект из Synapse пару модулей для работы с OpenSSL, кладешь рядом с exe-файлом две dll-библиотеки OpenSSL - всё работает. Правда, как при этом подсунуть свой сертификат - я не знаю, не приходилось пробовать. Помимо OpenSSL есть модули для работы с весьма небесплатными либами SecureBlackBox и StreamSec (если есть лицензии и хочется сделать по-хорошему - лучше их выбрать)