Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Synapse пример соденинения со своими ключами


Автор: igorsh 30.9.2009, 09:58
Добрый день!

Помогите пожалуйста примером или идеей на следующую проблему:

нужно написать сервер и клиент, который бы могли работать только друг с другом через SSL, при подключении к серверу "левого" клиента его отключать также и при подключении клиента к "левому" серверу отключаться от такого сервера. Т.е. в общем случае стоит проблема проверки подлинности сертификатов сервера и клиента. Обычное подключение по SSL (synapse сам генерит необходимые данные) у меня получаются, а вот со своими сертификатами не получается, т.е. соединение есть, но как проверить, что клиент "левый" я не знаю (проверяю броузером).

Спасибо за помощь!

Автор: Virtuals 30.9.2009, 12:24
igorsh
ну вот те для начала, /переделаная демка из http в https/
Код

unit http;
.....
procedure TTCPHttpThrd.Execute;
var
//  b: byte;
  timeout: integer;
  s: string;
  method, uri, protocol: string;
  size: integer;
  x, n: integer;
  resultcode: integer;
begin
 //HTTPS

 sock.SSL.CertificateFile:='host_x.pem';
 sock.ssl.PrivateKeyFile:='host_x.pem';
 sock.ssl.CertCAFile:='host_x.pem';
 sock.SSL.KeyPassword:='MyPassPro';

 sock.SSLAcceptConnection;
sock.SendString('HTTPS/1.0 ' + IntTostr(sock.Lasterror) + CRLF);
  if sock.Lasterror <> 0 then
    Exit;
.......


это для 
Цитата
а вот со своими сертификатами не получается

 smile дальше бум копать.

Автор: igorsh 30.9.2009, 14:06
Спасибо, за ответ!

Я именно так и делаю, но дело в том, что мне нужно как-то клиентов проверять.

Я делаю вот так на клиенте:
Код

    LHttp.Sock.SSL.PFXfile := 'ssl\client01.p12';
    LHttp.Sock.SSL.KeyPassword := 'q1w2e3';
    LHttp.HTTPMethod('GET', 'https://localhost');


сервер так пускает и выдаёт данные

и делаю вот так
Код

    //LHttp.Sock.SSL.PFXfile := 'ssl\client01.p12';
    //LHttp.Sock.SSL.KeyPassword := 'q1w2e3';
    LHttp.HTTPMethod('GET', 'https://localhost');


и так тоже сервер выдаёт данные, а хочется чтобы ругался smile

Автор: igorsh 1.10.2009, 09:21
Отвечаю сам себе. Может кому пригодится.

Оказывается надо было поставить в серверной части sock.SSL.VerifyCert := True;

Код

  sock.SSL.CertificateFile := 'ssl\ca.crt';
  sock.SSL.PrivateKeyFile := 'ssl\ca.key';
  sock.SSL.CertCAFile := 'ssl\ca.crt';
  sock.SSL.KeyPassword := '';
  sock.SSL.VerifyCert := True;


тогда у броузера сервер начинает запрашивать и проверять сертификат, а вот у клиента, который написан на Synapse почему-то пропускает соединение без сертификата, тогда таких хитрецов можно проверить на пустоту sock.SSL.GetCertInfo

вот так:
Код

  sock.SSLAcceptConnection;
  if (sock.SSL.GetCertInfo = '') then
    Abort();


а если у такого клиента задан сертификат, но он "левый", то в этом случае сервер его честно отбрасывает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)