Clarion и SSL
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1412
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Clarion и SSL
Решил создать отдельную тему по проблеме, которая страшно мешает жить проекту. Проблема возникла несколько лет назад, после того как большинство бесплатных почтовых серверов запретило прямое подключение и теперь для работы с ними требуется 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
Было бы очень замечательно каким-либо образом решить этот вопрос
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
Было бы очень замечательно каким-либо образом решить этот вопрос
- Вложения
-
- winssl.zip
- (3.05 КБ) 123 скачивания
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1412
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Clarion и SSL
Еще вариант нарисовался
В комплекте с IP Driver идут либы OpenSSL и к ним osslwrap.dll
Может быть, было бы проще работать через эту dll
Но без примера, "методом тыка" пока тоже не знаю как подойти
В комплекте с IP Driver идут либы OpenSSL и к ним osslwrap.dll
Может быть, было бы проще работать через эту dll
Но без примера, "методом тыка" пока тоже не знаю как подойти
-
- Полимат
- Сообщения: 1817
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 27 раз
- Поблагодарили: 10 раз
Clarion и SSL
... я ее решил с помощью https://code.google.com/p/mailsend/wiki/examples все просто и тривиально, так как продвигается гуглом, то при любых изменениях, изменения происходят и в данном приложении. Используется также и для рассылки спискомRaFaeL писал(а):... что по этой проблеме среди кларионщиков за столько лет не появилось решения...
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1412
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Clarion и SSL
Просто разослать можно и через функцию в ClaRunExt там есть флажок SSL
Мне нужно POP3 через TLS
Мне нужно POP3 через TLS
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
Ну вот накатал что то.
Все исходники с библиотеками. Писал на Clarion 10
Часть с сокетами выдрал из QuickSocket.CLW Такой результат при команде SL.Connect('5.255.255.55', 443) ! yandex.ru
Куда долбиться и какие команды слать х.з.
Это уже сами
Код: Выделить всё
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
Часть с сокетами выдрал из QuickSocket.CLW Такой результат при команде SL.Connect('5.255.255.55', 443) ! yandex.ru
Куда долбиться и какие команды слать х.з.
Это уже сами
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
Делал на коленке. Так что "AS IS"
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
А кстати с winssl.dll ничего не получилось т.к. SSLv23_client_method почему то возвращала 0. Переделал на виндовую ssleay32.dll и все заработало с ходу. По сути просто подменил DLL т.к. функции совпадают.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
На свой почтовый постучался.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
Я так понял что для смены вида шифрования нужно менять вызов функции SSLv23_client_method на соответствующую из списка
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
Еще можно добавить в MAP функцию
Возвращает количество байт которые ожидают чтения. Мне не нужно было для теста. А потом подумал... а как много строк читать.
Код: Выделить всё
SSL_pending(LONG SSL),LONG,RAW,PASCAL,NAME('SSL_pending')
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1412
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Clarion и SSL
В архиве чего-то не хватает. Ругается на WS_CONNECT и т.п. Хотел проверить так сказать в оригинале в 6.3
Потому что отдельно пробовал последовательности процедур вставлять куда мне нужно - как и ранее, вылет, причём вылет не на эти команды а на нечто произвольное после инициализации SSL
Потому что отдельно пробовал последовательности процедур вставлять куда мне нужно - как и ранее, вылет, причём вылет не на эти команды а на нечто произвольное после инициализации SSL
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
Я же написал что тестировал на Clarion 10
Из него можно взять файл WINSOCK.INC, там описаны эти функции.
Или в аттаче
Из него можно взять файл WINSOCK.INC, там описаны эти функции.
Или в аттаче
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Clarion и SSL
В целом, класс сейчас работает. Отдельно я не знаю что там у вас не так. Нужно смотреть и разбираться.
Отлаживать учить что ли?

Вставляйте проверки после каждой команды. Смотрите что команда должна возвращать.
SSL команды все в гугле ищутся. Или смотрим тут
Возвращаемые параметры описаны.
Сравнивайте результаты с работающим примером. Удалите код связанный с вашими предыдущими попытками работы с SSL
Может быть где то дублируется описание функций или еще что.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1412
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Clarion и SSL
Надо же, столько лет не меняли этот файл а в 10-ке поменяли
Специально посмотрел а 9.1, там от 6.3 разница в одну функцию, а тут вон оно что