Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2013, 14:54   #11
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Буду читать... Спасибо!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 29.08.2013, 17:43   #12
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

По ссылке из предыдущего поста проделал всю процедулу создания CА-ключа и сертификата, создал клиентский сертификат, подписанный CA-сертификатом. Даже сделал p12-установочный пакет и поставил клиентский сертификат в систему на всякий случай (хотя бред, но все же).
В итоге ошибка: Network subsystem is unusable
Клиент:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  LSock:TTCPBlockSocket;
begin
  try
    LSock:=TTCPBlockSocket.Create;
    LSock.SSL.CertificateFile:=ExtractFilePath(ParamStr(0))+'keys\client01.crt';
    LSock.SSL.VerifyCert:=True;
    LSock.Connect('localhost','9050');
    LSock.SSLDoConnect;
    Memo1.Text:=LSock.SSL.GetCertInfo;
    if LSock.LastError<>0 then Edit1.Text:=LSock.LastErrorDesc;
    LSock.SendString('123');
  finally
    LSock.Free;
  end;
end;
Сервер:
Код:
function TTcpClient.InitSSL:Boolean;
var
  LErrMsg:AnsiString;//описание ошибки
begin
  Result:=True;
  try
    with FSock.SSL do
    begin
      PrivateKeyFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.key';
      CertCAFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.crt';
      CertificateFile:=ExtractFilePath(ParamStr(0))+'keys\client01.crt';
      VerifyCert:=True;
      KeyPassword:='xYkd';
      if (not FSock.SSLAcceptConnection) then raise Exception.Create(LastErrorDesc);
      if (not (GetVerifyCert in [0,18])) or (GetCertInfo='') then raise Exception.Create('Certificate information is empty');
    end;
  except
    on E:Exception do
    begin
      LErrMsg:=Format('TTcpClient.InitSSL: [%s:%d] - %s',
                      [FSock.GetRemoteSinIP,FSock.GetRemoteSinPort,E.Message]);
      gLog.Log(ltError,LErrMsg);
      Result:=False;
    end;
  end;
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 29.08.2013, 18:07   #13
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

CertCA - нужен только серверу, клиенту обычно пофиг
Код:
constructor TTcpServer.Create(const AConfig:TTcpStruct);
begin
  inherited Create(True);
  FreeOnTerminate:=False;
  InitializeCriticalSection(FRTL);
  FConfig:=AConfig;
  FSock:=TTCPBlockSocket.Create;
  with FSock.SSL do
  begin
    SSLType:=LT_all;
    PrivateKeyFile:=ExtractFilePath(ParamStr(0))+'priv.key';
    CertificateFile:=ExtractFilePath(ParamStr(0))+'cert.crt';
    CertCAFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.crt';
    VerifyCert:=True;
  end;
  FClientList:=TList.Create;
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 30.08.2013, 11:11   #14
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Т.е. хотите сказать, что ключевые параметры SSL следует давать слушающему потоку, а не установленному клиентскому соединению? А будет ли это верным? Ведь слушающий поток ответственнен лишь за прием входящих соединений.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.09.2013, 21:34   #15
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Разобрался, заработало! Теперь сервер пускает только клиентов с сертификатами, подписанными серверным СА-сертификатом. Спасибо всем!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 04.09.2013, 10:55   #16
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Дабы не создавать новую тему, продолжу здесь же.
Мои старания работают только по TCPS. Если посылать POST-запрос по HTTPS на мой сервер, то выдает такую ошибку:
Код:
[2013-09-04 10:47:56]
TTcpClient.InitSSL: [127.0.0.1:51782] - Network subsystem is unusable
А браузер возвращает:
Безымянный.png
Содержимое htm-файла:
Код:
<html>
<head>
<title>HTTPS шлюз</title>
</head>

<body>

<form action="https://localhost:9050" method="post">

<SELECT name="Method" size=1>
	<OPTION selected value="CheckGIDPIN">CheckGIDPIN</OPTION>
	<OPTION value="StrServerTime">StrServerTime</OPTION>
	<OPTION value="GetReestrOnDate">GetReestrOnDate</OPTION>
	<OPTION value="GetReestrOnDateByRS">GetReestrOnDateByRS</OPTION>
	<OPTION value="GetLastPayByGID">GetLastPayByGID</OPTION>
	<OPTION value="GetPayByIdReceiptGroup">GetPayByIdReceiptGroup</OPTION>
	<OPTION value="GetReestrPaysByGID">GetReestrPaysByGID</OPTION>
</SELECT> 
<p>
Метод: <input name="ID_DATABASE"   type="text" value="333">
<p>
ID_USER = <input name="ID_USER"       type="text" value="5133">
<p>
ID_COMPANY = <input name="ID_COMPANY"    type="text" value="2363">
<p>
ID_DEPARTMENT = <input name="ID_DEPARTMENT" type="text" value="5621">
<p>
ID_AGENT = <input name="ID_AGENT"      type="text" value="1023">
<p>
DATE_ON = <input name="DATE_ON"      type="text" value="02.09.2013">
<p>
<!--
GID = <input name="GID"           type="text" value="900381412">
<p>
ID_RECEIPT_GROUP = <input name="ID_RECEIPT_GROUP"           type="text" value="">
<p>
-->
<input type="submit">
</form>
</body>
</html>
Код сервера инициализации SSL:
Код:
function TTcpClient.InitSSL:Boolean;
begin
  Result:=True;
  try
    with FSock.SSL do
    begin
      PrivateKeyFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.key';
      TrustCertificateFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.crt';
      CertCAFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.crt';
      CertificateFile:=ExtractFilePath(ParamStr(0))+'keys\bgate.crt';
      VerifyCert:=True;
    end;
    if (not FSock.SSLAcceptConnection) then
      raise Exception.Create(FSock.LastErrorDesc);
    gLog.Log(ltEvent,'GetVerifyCert='+IntToStr(FSock.SSL.GetVerifyCert)+#13#10'GetCertInfo="'+FSock.SSL.GetCertInfo+'"');
    if (not (FSock.SSL.GetVerifyCert in [0,18])) or (FSock.SSL.GetCertInfo='') then
      raise Exception.Create('Certificate information is not valid or empty');
  except
    on E:Exception do
    begin
      gLog.Log(ltError,Format('TTcpClient.InitSSL: [%s:%d] - %s',
                              [FSock.GetRemoteSinIP,FSock.GetRemoteSinPort,E.Message]));
      Result:=False;
    end;
  end;
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 05.09.2013, 12:06   #17
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос

Может у кого есть идеи, почему через браузер не выполняет запрос? клиентский сертификат и ключ установлены. При посыле запроса предлагает выбрать установленный сертификат:
1.png
Сервис логгирует ошибку на такой запрос:
Код:
[2013-09-05 12:03:48]
TTcpClient.InitSSL: [127.0.0.1:59214] - Network subsystem is unusable
Кто может подсказать, куда копать? Напоминаю, по TCPS отрабатывает на ура. Может в опциях браузера что? Хотя все протоколы обмена SSL и TLS включены.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 05.09.2013, 15:38   #18
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

догадка и только поиграй SSLType:<>LT_all;
и не указано где хотя бы примерно в коде вылазит ошибка
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 05.09.2013 в 15:41.
Slym вне форума Ответить с цитированием
Старый 05.09.2013, 17:21   #19
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Она вылазает на строчке
Код:
  if (not FSock.SSLAcceptConnection) then
      raise Exception.Create(FSock.LastErrorDesc);
Т.е. не происходит SSL-авторизация. Попробую.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 06.09.2013, 08:08   #20
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

SSLType никак не влияет на ситуацию. Единственно, выяснил, что для безошибочного обмена на сервер и клиенте SSLType должны совпадать. LT_TLS1_1 не валидирует сертификаты. Но суть не в том. Проблема с браузером остается открытой. Какие еще идеи будут? У меня закончилось воображение.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Synapse. Создание Web-сервера Lardes Работа с сетью в Delphi 2 23.02.2013 00:19
Synapse + SSL + Socks5 = виснут соединения Puhovoi Работа с сетью в Delphi 2 01.12.2012 22:39
Клиент-серверное приложение, создание сервера через MS SQL Server и подключение c ADO (CRM) StuDenT5x3 БД в Delphi 5 14.08.2011 17:12
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05
Реализация клиент сервер через delphi и java Horus92 Свободное общение 0 15.10.2010 22:27