![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2013
Сообщений: 3
|
Здравствуйте.
Я не флэш-программист, но участвую в написании серверной части проекта, в котором требуется организовать защищенное соединение между клиентом на Флеше и сервером. Для реализации этого со стороны сервера используется библиотека OpenSSL а со стороны клиента мы попытались использовать класс SecureSocket. Как сказал наш флеш-программист, клиент запускается из AIR. Первая проблема, с которой я столкнулся при реализации - это некоторое несоответствие заявленных возможностей класса SecureSocket реальности. В частности, в документации указано, что SecureSocket поддерживает TLS. Однако при попытке установить контекст SSL на поддержку только TLS соединение не происходило и выходило сообщение об ошибке. Проблему удалось обойти, включив при создании контекста SSL поддержку устаревших типов SSLv2 и SSLv3. После этого пошла попытка соединения TLSv1 с несколько устаревшим шифром RC4-MD5 (128 bits), но тут всплыла проблема 843 порта и приснопамятного crossdomain.xml Для ее решения я написал демон, который слушает этот порт и после получения от клиента запроса <policy-file-request/> отдает ему политику. Выяснилось, что это прекрасно работает для обычного сокета, однако ни в какую не хочет работать для сокета защищенного. Клиент соединяется на 843 порт, успешно проходит рукопожатие SSL, однако потом функция SSL_read вместо строки <policy-file-request/> возвращает ответ нулевой длины и, судя по ряду признаков, нижележащее соединение разрывается. Запрос файла политики так и не приходит. В то время как тестовый клиент, написанный на С, успешно соединяется с демоном файла политики и возвращает оную: $ ./fspfd_client Тестовый клиент демона файлов политики сокетов для Flash Запуск: client [IP-адрес сервера fspfd] Инициализация SSL успешно завершена SSL соединение успешно установлено Установлено SSL соединение <?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="*" to-ports="*" /> </cross-domain-policy> При попытке же запустить флеш-клиента вываливаются следующие ошибки: Запуск из среды разработки: IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2031: Socket Error. URL: aaa.bbb.ccc.ddd" errorID=2031 Запуск из браузера: securityErrorHandler: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"] Лично мне из этих ошибок ни хрена не понятно. В нормальных библиотеках на С/С++ обычно есть штатные функции для перевода кодов ошибок в человекоориентированную форму, например функция perror(); позволяет в случае аварийного завершения функции из стандартной библиотеки получить человекочитаемое сообщение об ошибке, из которого обычно можно понять, в чем проблема и как ее решить. Есть ли на флеше возможность получить человеческий вывод ошибок а не эти дурацкие коды? Сообщения из логов: Тестовый клиент на С Apr 24 23:29:57 [4883]: [INFO] client connection established Apr 24 23:29:57 [4883]: [INFO] SSL handshake success Apr 24 23:29:57 [4883]: [INFO] SSL connection established: SSL version: TLSv1 cipher: AES256-SHA (256 bits) Apr 24 23:29:57 _client: [INFO] SSL handshake success Apr 24 23:29:57 [4883]: [INFO] ssl_shutdown success Apr 24 23:29:57 [4883]: [INFO] SSL connection shutdown Apr 24 23:29:57 [4883]: [INFO] client connection shutdown Apr 24 23:29:57 _client: [INFO] ssl_shutdown success Apr 24 23:40:21 [4937]: [INFO] client connection established Apr 24 23:40:22 [4937]: [INFO] SSL handshake success Apr 24 23:40:22 [4937]: [INFO] SSL connection established: SSL version: TLSv1 cipher: RC4-MD5 (128 bits) Apr 24 23:40:22 [4937]: [ERR] ssl_read error: Apr 24 23:40:22 [4937]: [ERR] ssl_read error: zero len response Apr 24 23:40:22 [4937]: [ERR] SSL_shutdown error: Apr 24 23:40:22 [4937]: [INFO] SSL connection shutdown Apr 24 23:40:22 [4937]: [INFO] client connection shutdown Последний раз редактировалось mooncar; 25.04.2013 в 10:19. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
С вероятностью 99% процентов flash не принимает сертификат вашего сервера. Поэтому вопрос: кем подписан ваш сертификат (т.е. какая именно CA его выдала)? Знает ли flash о нем, настроена ли нужна CA на клиенте? Как ваш тестовый C-клиент выполняет валидацию сертификата?
Цитата:
Цитата:
|
|
|||||
|
Регистрация: Apr 2013
Сообщений: 3
|
Цитата:
Apr 24 23:40:22 [4937]: [INFO] SSL handshake success Apr 24 23:40:22 [4937]: [INFO] SSL connection established: SSL version: TLSv1 cipher: RC4-MD5 (128 bits) Насколько я знаю, проведение SSL хэндшейка будет несколько затруднительно если клиент не имеет всех необходимых для этого данных ![]() Цитата:
По поводу С-клиента: сначала порождается контекст SSL, делаются необходимые настройки в нем а потом вызывается функция SSL_connect. При ее вызове автоматически происходит хэндшейк, во время которого происходят необходимые проверки. В случае успеха устанавливается SSL соединение, а при неудаче в лог вываливается куча ошибок. Цитата:
Вобщем, на мой взгляд, шансы на то, что в проблеме замешан сертификат, весьма малы. Я конечно не могу их сбрасывать со счетов окончательно, так как не знаю какой код наворотили программисты из Адоба для реализации класса SecureSocket, но думаю, что проблема в чем-то другом. Если у кого-то есть еще мысли я готов послушать. Пока что я улучшил серверную подсистему вывода ошибок, так что может быть еще чего-то всплывет. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Не понятно, почему он у вас из среды разработки не может соединиться с сокетом... Там ошибка именно соединения. firewall мешает или что-то еще экзотическое? Вообще, в сообщениях (флеш) об ошибке есть text, но у вас в этом text ничего интересного нет.
Цитата:
Заодно и на C-клиенте проверите, будет он с неизвестным сертификатом соединяться или нет. Я не знаю, какую технологию вы используете, поэтому не могу точно сказать, что именно в сертификате проверяет С-клиент (и проверят ли вообще)? Там могут быть очень и очень забавные приколы с настройками по-умолючанию, интеграции с системным хранилищем и т.п.. Если сможете сказать, будет хорошо. Я не утверждаю, что у вас неправильно, просто не видя кода такое может быть. Есть ли информация, по какой причине там "zero len response"? В ваших логах я никаких дополнительных кодов не вижу. А вот openssl, например, позволяет различить, как именно было закрыто соединение (корректно или совсем некорректно). P.S. Вот здесь есть более приличная расшифровка флешовых кодов. Я у себя тоже достаточно много информации получал то ли выводом text, то ли event.toString... Или, может быть, это было из-за debug-plugin'а. Добавлено через 4 минуты Небольшое добавление. Посмотрел пример в адобе, там есть Мало ли что там будет для crossdomain.xml. Но вдруг... Ну и другие поля можно в случае ошибки во флеш посмотрет, вдруг что-то найдется. |
|
|||||
|
listener
|
Может бред, но послушайте 443 порт на предмет <policy-file-request/> и последующей отправки кроссдоменника клиенту. Я что-то засомневался, что для разрешения ssl соедиения требуется загрузить дополнительно некий файл с другого порта....
Ошибки говорят, что сначала не найден/не загружен кроссдоменник и, как следствие, SecurityError... |
|
|||||
|
Регистрация: Apr 2013
Сообщений: 3
|
Цитата:
Да, маленькое уточнение для устранения возникшего недопонимания (я про пост maxkar ). Цитата:
Я сделал расширенный вывод ошибок и может быть появится информация почему там ответ нулевой длины. Проверить сейчас не могу, так как у меня нету флеш-клиента. Как инфа появится - отпишусь. Добавлено через 3 часа 53 минуты Вобщем ничего хорошего сказать не могу. Что я точно выяснил: 1. Трафика по 443 порту не было 2. Попытка чтения из SSL соединения по прежнему безуспешна SSL_read просто возвращает ноль и все. При этом никаких сообщений об ошибках из самой библиотеки OpenSSL не приходит, в логах пусто. Добавлено через 5 часов 47 минут Цитата:
Буду читать маны.Добавлено через 5 часов 53 минуты Дополнение от флеш-программиста: Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|