Страница 1 из 2

Clarion и SSL

Добавлено: 23 Октябрь 2015, 18:56
RaFaeL
Решил создать отдельную тему по проблеме, которая страшно мешает жить проекту. Проблема возникла несколько лет назад, после того как большинство бесплатных почтовых серверов запретило прямое подключение и теперь для работы с ними требуется TLS/SSL. При этом в проекте без почты никуда. Частично решается использованием программы stunnel но это очень неудобно. Есть очень большое желание как-либо решить эту проблему и мне кажется очень странным, что по этой проблеме среди кларионщиков за столько лет не появилось решения, при том что есть несколько разных библиотек для работы с почтой и интернетом. Варианты:

1) WinAPI на основе schannel.dll. Это был бы самый правильный путь но он же самый сложный

2) OpenSSL. Пробовали несколько лет назад, "не взлетело", только вылетало уже на второй или третьей функции

3) Нечто под названием PolarSSL. Написано что все очень просто но я ничего не понял и не нашел там собственно готовой dll

4) WinSSL.dll. Эта либа шла ранее в комплекте с Мирандой 0.7.13 и к ней есть исходники. По сути, это обертка над п.1. Мне кажется, это был бы самый простой путь решения вопроса. Что удалось накопать по теме:
http://darkoff.ru/2012/02/ssl-на-сокетах-в-c/ - тут библиотеку используют в исходниках
http://forum.antichat.ru/threads/267997/#post-2624787 - тут можно посмотреть список функций, проверял, действительно есть

Что точно не подходит:
- ClaRunExt так как там нет приема почты (и вряд ли будет)
- NetTalk так как надо под 6.3

Было бы очень замечательно каким-либо образом решить этот вопрос

Clarion и SSL

Добавлено: 24 Октябрь 2015, 11:27
RaFaeL
Еще вариант нарисовался
В комплекте с IP Driver идут либы OpenSSL и к ним osslwrap.dll
Может быть, было бы проще работать через эту dll
Но без примера, "методом тыка" пока тоже не знаю как подойти

Clarion и SSL

Добавлено: 24 Октябрь 2015, 11:45
gopstop2007
RaFaeL писал(а):... что по этой проблеме среди кларионщиков за столько лет не появилось решения...
... я ее решил с помощью https://code.google.com/p/mailsend/wiki/examples все просто и тривиально, так как продвигается гуглом, то при любых изменениях, изменения происходят и в данном приложении. Используется также и для рассылки списком

Clarion и SSL

Добавлено: 24 Октябрь 2015, 12:17
RaFaeL
Просто разослать можно и через функцию в ClaRunExt там есть флажок SSL
Мне нужно POP3 через TLS

Clarion и SSL

Добавлено: 24 Октябрь 2015, 12:28
Admin
Ну вот накатал что то.

Код: Выделить всё

  PROGRAM

  INCLUDE('WINSOCK.INC')
  INCLUDE('windows.inc')

  MAP
    MODULE('WinSSL.DLL')
      SSL_library_init(),LONG,RAW,PASCAL,NAME('SSL_library_init')
      SSL_CTX_new(LONG Method),LONG,RAW,PASCAL,NAME('SSL_CTX_new')
      SSLv23_client_method(),LONG,RAW,PASCAL,NAME('SSLv23_client_method')
      SSL_new(LONG),LONG,RAW,PASCAL,NAME('SSL_new')
      SSL_free(LONG SSL),RAW,PASCAL,NAME('SSL_free')
      SSL_set_fd(LONG SSL, LONG Sock),LONG,RAW,PASCAL,NAME('SSL_set_fd')
      SSL_connect(LONG SSL),LONG,RAW,PASCAL,NAME('SSL_connect')
      SSL_write(LONG SSL, LONG Buffer, LONG BufferSize),LONG,RAW,PASCAL,NAME('SSL_write')
      SSL_read(LONG SSL, LONG Buffer, LONG BufferSize),LONG,RAW,PASCAL,NAME('SSL_read')
      SSL_get_error(LONG SSL, LONG ret),LONG,RAW,PASCAL,NAME('SSL_get_error')
    END
  END


SSLClass                CLASS,TYPE
WSA                       LIKE(WSAData)
Sock                      SOCKET
SSL                       LONG
Init                      PROCEDURE
Init_Winsock              PROCEDURE(),LONG,PROC
Init_DLL                  PROCEDURE(),LONG
Connect                   PROCEDURE(STRING ServerIP, STRING PortNumber),LONG 
Kill                      PROCEDURE()
Send                      PROCEDURE(STRING Text) 
Read                      PROCEDURE(),STRING 
                        END

SL                      SSLClass

  CODE
  SL.Init()
  IF SL.Connect('5.255.255.55', 443)
    MESSAGE('Error on connect')
  END  
  SL.Send('GET / HTTP/1.0\r\nHost: forum.antichat.ru\r\n\r\n')
  MESSAGE(SL.Read())
  SL.Kill()
  !MESSAGE('End & unload')

SSLClass.Init           PROCEDURE
  CODE
  IF SELF.Init_Winsock()
    MESSAGE('Error on init Winsock')
    RETURN
  END
  SELF.SSL = SELF.Init_DLL()
  IF ~SELF.SSL
    MESSAGE('Error on init SSL')
    RETURN
  END
  !MESSAGE('SSL handle: ' & SELF.SSL)

SSLClass.Kill           PROCEDURE()  
  CODE
  IF SELF.SSL
    SSL_free(SELF.SSL)
  END

SSLClass.Send           PROCEDURE(STRING Text) 
LOC:buffer              CSTRING(2048)
  CODE 
  LOC:buffer = Text
  Err# = SSL_write(SELF.SSL,ADDRESS(LOC:buffer),SIZE(LOC:buffer))
  !MESSAGE('SSL_write: ' & Err# & '|GetLastError: ' & GetLastError())

SSLClass.Read           PROCEDURE()!,STRING 
LOC:buffer              CSTRING(2048)
  CODE 
  Err# = SSL_read(SELF.SSL,ADDRESS(LOC:buffer),SIZE(LOC:buffer))
  !MESSAGE('SSL_read: ' & Err#)
  RETURN LOC:buffer

SSLClass.Init_Winsock   PROCEDURE()
s                       SOCKET
wsaDataBlock            LIKE(WSAData)
  CODE
  s = WS_SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP)
  IF s = SOCKET_ERROR
    IF WSAGetLastError() = WSANOTINITIALISED                ! Was it that the socket layer wasn't initialised?
      IF WSAStartup(s32_Version2_0, wsaDataBlock)         ! Tries to initialize it
        RETURN 1                                            ! If still an error, give up
      END
      s = WS_SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP)
      IF s = SOCKET_ERROR THEN RETURN 1 END                 ! Still error, give up
    END
  END
  SELF.Sock = s
  RETURN 0

SSLClass.Init_DLL       PROCEDURE()    
Method                  LONG
SSL_CTX                 LONG
  CODE
  Ret# = SSL_library_init()
  IF Ret#
    Method = SSLv23_client_method()
    IF Method
      SSL_CTX = SSL_CTX_new(Method)
      IF SSL_CTX
        SSL_Ret# = SSL_new(SSL_CTX)  
        RETURN SSL_Ret#
      END
    END  
  END
  RETURN 0
  
SSLClass.Connect        PROCEDURE(STRING pServerIp, STRING pPortNumber)!,LONG   
szIP                    CSTRING(64)
inetAddr                ULONG
dest                    LIKE(SOCKADDR_IN)
ret                     LONG
  CODE
  szIP = pServerIp
  inetAddr = WS_INET_ADDR(szIP)
  IF inetAddr = INADDR_NONE OR inetAddr = INADDR_ANY
    MESSAGE('Can''t connect to "ANY" address')
    RETURN 1
  END
  dest.sin_family = AF_INET
  dest.sin_addr.s_un.s_addr = inetAddr
  dest.sin_port = WS_HTONS(pPortNumber)
  IF WS_CONNECT(SELF.Sock, ADDRESS(dest), SIZE(dest) ) = SOCKET_ERROR
    MESSAGE('Socket error')
    RETURN 2
  END
  IF ~SSL_set_fd(SELF.SSL, SELF.Sock)
    RETURN 3
  END
  ret = SSL_connect(SELF.SSL)
  IF ret <> 1
    MESSAGE(SSL_get_error(SELF.SSL, ret),'SSL_get_error')
  END
  RETURN 0
Все исходники с библиотеками. Писал на Clarion 10
Часть с сокетами выдрал из QuickSocket.CLW
Windows SSL.zip
Windows SSL
(1.54 МБ) 138 скачиваний
Такой результат при команде SL.Connect('5.255.255.55', 443) ! yandex.ru
Куда долбиться и какие команды слать х.з.
Это уже сами
2015-10-24 19-25-14.png
2015-10-24 19-25-14.png (2.23 КБ) 5197 просмотров

Clarion и SSL

Добавлено: 24 Октябрь 2015, 12:29
Admin
Делал на коленке. Так что "AS IS"

Clarion и SSL

Добавлено: 24 Октябрь 2015, 12:46
Admin
А кстати с winssl.dll ничего не получилось т.к. SSLv23_client_method почему то возвращала 0. Переделал на виндовую ssleay32.dll и все заработало с ходу. По сути просто подменил DLL т.к. функции совпадают.

Clarion и SSL

Добавлено: 24 Октябрь 2015, 12:54
RaFaeL
Спасибо, буду смотреть!

Clarion и SSL

Добавлено: 24 Октябрь 2015, 12:54
Admin
На свой почтовый постучался.
2015-10-24 19-53-24.png

Clarion и SSL

Добавлено: 24 Октябрь 2015, 13:08
Admin
Я так понял что для смены вида шифрования нужно менять вызов функции SSLv23_client_method на соответствующую из списка
2015-10-24 20-07-33 LibMaker.png

Clarion и SSL

Добавлено: 24 Октябрь 2015, 13:10
Admin
Еще можно добавить в MAP функцию

Код: Выделить всё

      SSL_pending(LONG SSL),LONG,RAW,PASCAL,NAME('SSL_pending')
Возвращает количество байт которые ожидают чтения. Мне не нужно было для теста. А потом подумал... а как много строк читать.

Clarion и SSL

Добавлено: 24 Октябрь 2015, 16:15
RaFaeL
В архиве чего-то не хватает. Ругается на WS_CONNECT и т.п. Хотел проверить так сказать в оригинале в 6.3
Потому что отдельно пробовал последовательности процедур вставлять куда мне нужно - как и ранее, вылет, причём вылет не на эти команды а на нечто произвольное после инициализации SSL

Clarion и SSL

Добавлено: 24 Октябрь 2015, 16:35
Admin
Я же написал что тестировал на Clarion 10
Из него можно взять файл WINSOCK.INC, там описаны эти функции.
Или в аттаче
WINSOCK.INC
(39.65 КБ) 467 скачиваний

Clarion и SSL

Добавлено: 24 Октябрь 2015, 16:42
Admin
RaFaeL писал(а): Потому что отдельно пробовал последовательности процедур вставлять куда мне нужно
В целом, класс сейчас работает. Отдельно я не знаю что там у вас не так. Нужно смотреть и разбираться.
RaFaeL писал(а): а на нечто произвольное после инициализации SSL
Отлаживать учить что ли? :)
Вставляйте проверки после каждой команды. Смотрите что команда должна возвращать.
SSL команды все в гугле ищутся. Или смотрим тут
Возвращаемые параметры описаны.
Сравнивайте результаты с работающим примером. Удалите код связанный с вашими предыдущими попытками работы с SSL
Может быть где то дублируется описание функций или еще что.

Clarion и SSL

Добавлено: 24 Октябрь 2015, 16:59
RaFaeL
Admin писал(а): Я же написал что тестировал на Clarion 10Из него можно взять файл WINSOCK.INC, там описаны эти функции.
Надо же, столько лет не меняли этот файл а в 10-ке поменяли
Специально посмотрел а 9.1, там от 6.3 разница в одну функцию, а тут вон оно что