SVTX Опубликовано 10 декабря, 2014 Поделиться Опубликовано 10 декабря, 2014 В интернете есть много сайтов с ошибочными или неверными ssl сертификатами. При открытии данного сайта в других браузерах выдается сообщение о таком сертификате и предложение либо принять его либо отклонить. В TWebBrowser никаких обработок нет и собственно по умолчанию сайт просто не отрывается. Кто подскажет как можно решить данную проблему? UFatueks 1 Цитата Ссылка на комментарий
0 SVTX Опубликовано 15 декабря, 2014 Автор Поделиться Опубликовано 15 декабря, 2014 Неужели никто не сталкивался с такой проблемой?? она ведь нивелирует функционал TWebBrowser. Так как любой сертификат любимого сайта может истечь по сроку давности и вы уже не сможете зайти на него. Что же делать? Цитата Ссылка на комментарий
0 SVTX Опубликовано 16 декабря, 2014 Автор Поделиться Опубликовано 16 декабря, 2014 Кое что накопал сам. В юните FMX.WebBrowser.Android.pas есть метод TWebBrowserListener.onReceivedSslError. По документации Андроид в нем можно обработать данную ошибку. Но команда proceed; не дает никакого результата(( Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 30 декабря, 2014 Администраторы Поделиться Опубликовано 30 декабря, 2014 А есть ли у вас ссылка на такой сайт с истекшим сертификатом? Цитата Ссылка на комментарий
0 SVTX Опубликовано 2 января, 2015 Автор Поделиться Опубликовано 2 января, 2015 Да конечно. https://myhealth.catawbavalleymc.org К сожалению средствами Delphi X6 победить данную проблему не получилось. Переписывались исходники всего FMX.WebBrowser.Android.pas. Пришлось полностью делать Активити на Java и вызывать его из Делфи приложения. Цитата Ссылка на комментарий
0 estra Опубликовано 31 августа, 2015 Поделиться Опубликовано 31 августа, 2015 SVTX если не трудно, пожалуйста, поделитесь решением, очень нужно. Цитата Ссылка на комментарий
0 Rusland Опубликовано 2 июня, 2017 Поделиться Опубликовано 2 июня, 2017 Тоже ищу решения данной проблемы. Не открывается сайт с неверным сертификатом. Как обойти? Цитата Ссылка на комментарий
1 Fedor K Опубликовано 3 июня, 2017 Поделиться Опубликовано 3 июня, 2017 В 16.12.2014 в 18:27, SVTX сказал: В юните FMX.WebBrowser.Android.pas есть метод TWebBrowserListener.onReceivedSslError. По документации Андроид в нем можно обработать данную ошибку. Но команда proceed; не дает никакого результата(( Причина такого поведения довольно простая - java библиотеки FMX часто передают в Delphi только уведомление о событии, без непосредственного влияния на процесс. Открываем библиотеку fmx.jar и смотрим код класса WebClient (package com.embarcadero.firemonkey.webbrowser;): public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error);// обработка ошибки происходит здесь по дефолту if (this.mListener != null) { this.mListener.onReceivedSslError(view, handler, error);//передача в Delphi лишь уведомления, что событие произошло } } Одно из решений*: 1. Заменяем** код на: public void onReceivedSslError(WebView paramWebView, SslErrorHandler paramSslErrorHandler, SslError paramSslError) { if (this.mListener != null) { this.mListener.onReceivedSslError(paramWebView, paramSslErrorHandler, paramSslError);//Delphi обработчик } else { super.onReceivedSslError(paramWebView, paramSslErrorHandler, paramSslError);//обработчик по умолчанию } } После манипуляций получаем свою версию библиотеки, мой пример здесь (Delphi Berlin). 2. Подключаем библиотеку к проекту (скриншот ниже). 3. Копируем unit FMX.WebBrowser.Android в папку своего проекта и меняем следующие строки: procedure TAndroidWebBrowserService.TWebBrowserListener.onReceivedSslError( P1: JWebView; P2: JSslErrorHandler; P3: JSslError); begin P2.proceed;//добавляем разрешение для истекших сертификатов FWBService.FailLoadingWithError;//стандартный обработчик OnDidFailLoadWithError end; *Если вариант изменения кода java библиотек совсем не подходит, можно реализовать все средствами Delphi. Для этого создаем свою реализация класса WebViewClient (или WebClient) и задаем его для JWebBrowser: //все тот же unit FMX.WebBrowser.Android; procedure TAndroidWebBrowserService.InitUIThread; var lClient : TWebBrowserCLientFix;//наш класс begin FJWebBrowser := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FJWebBrowser.getSettings.setJavaScriptEnabled(True); lClient := TWebBrowserCLientFix.Create(Self); FJWebBrowser.setWebViewClient(lClient);//меняем на наш класс FListener := TWebBrowserListener.Create(Self); lClient.SetWebViewListener(FListener); //комментируем //FJWebBrowser.SetWebViewListener(FListener); **Замена кода происходит по тому же сценарию, как и создание своих собственных классов на java. Если кому потребуется помощь - пишите, я помогу ответами и примером. enatechno, Rusland, #WAMACO и 3 других 6 Цитата Ссылка на комментарий
0 Rusland Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 @Fedor K в вашем примере принимается любой SSL сертификат (даже просроченные)? Цитата Ссылка на комментарий
0 Fedor K Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 8 минут назад, Rusland сказал: @Fedor K в вашем примере принимается любой SSL сертификат (даже просроченные)? Да, любой сертификат. Цитата Ссылка на комментарий
0 Rusland Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 (изменено) Попробовал первым способом, подключил fmx.jar, отключил fmx.dex.jar, закинул в папку с проектом FMX.WebBrowser.Android.pas, внес в него вышеуказанные исправления. При запуске программы вылетает First chance exception at $72DA3858. Exception class Segmentation fault (11). Почему так? PS. Berlin, планшет Lenovo Android 5, телефон Xiaomi RN4 Android 6 Изменено 5 июня, 2017 пользователем Rusland Цитата Ссылка на комментарий
0 Rusland Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 Вот тестовый пример. Посмотрите пожалуйста, что в нем не верно? FmxJarTest.zip Цитата Ссылка на комментарий
0 Rusland Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 (изменено) Дошло в чем у меня была проблема: оказалось что я в проект подкидывал FMX.WebBrowser.Android.pas из Токио, а не Берлина. Fedor K, cпасибо Изменено 5 июня, 2017 пользователем Rusland Fedor K 1 Цитата Ссылка на комментарий
0 jordi Опубликовано 14 июля, 2017 Поделиться Опубликовано 14 июля, 2017 Hello! Sorry for not speaking russian... I've found this forum talking about an error in onReceivedSslError. Translating with google from russian to spanish, it seems that you've found a solution providing a new jar. I've tried fmx.jar from "FmxJarTest.zip" in Tokyo, but I get segmentaion fault (11) when application starts. Is this code compatible with Tokyo? The other link in dropbox doesn't work. Thank you very much! Jordi Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 14 июля, 2017 Администраторы Поделиться Опубликовано 14 июля, 2017 1 час назад, jordi сказал: Hello! Sorry for not speaking russian... I've found this forum talking about an error in onReceivedSslError. Translating with google from russian to spanish, it seems that you've found a solution providing a new jar. I've tried fmx.jar from "FmxJarTest.zip" in Tokyo, but I get segmentaion fault (11) when application starts. Is this code compatible with Tokyo? The other link in dropbox doesn't work. Thank you very much! Jordi Hello, Tokio has changed fmx jar files, so this archive is obsolete Цитата Ссылка на комментарий
0 jordi Опубликовано 14 июля, 2017 Поделиться Опубликовано 14 июля, 2017 Ok, I understand it. Thank you very much. Maybe someone can provide an updated Tokyo version? I'm very lost in Android/Java world... Or maybe someone can explain the necessary steps to generate this fmx.jar? Thanks in advance Цитата Ссылка на комментарий
0 Rusland Опубликовано 6 октября, 2017 Поделиться Опубликовано 6 октября, 2017 В 05.06.2017 в 10:28, Fedor K сказал: Да, любой сертификат. А как решить эту проблему для iOS? Цитата Ссылка на комментарий
0 Fedor K Опубликовано 3 ноября, 2017 Поделиться Опубликовано 3 ноября, 2017 В 06.10.2017 в 16:25, Rusland сказал: А как решить эту проблему для iOS? Думаю вполне реально. Пример обхода этой проблемы есть ссылка #1 и ссылка #2. Методика следующая: Добавляем в .plist из комментария разрешения. Открываем FMX.WebBrowser.Delegate.iOS и правим TWebViewDelegate.shouldStartLoadWithRequest, запрещая загрузку при получении invalid сертификата. Создаем экземпляр NSURLConnection и выполняем тот же запрос. В методе didReceiveAuthenticationChallenge доверяем сертификату. Выполняем загрузку страницы в webView заново. В 14.07.2017 в 11:10, jordi сказал: Hello! Sorry for not speaking russian... I've found this forum talking about an error in onReceivedSslError. Translating with google from russian to spanish, it seems that you've found a solution providing a new jar. I've tried fmx.jar from "FmxJarTest.zip" in Tokyo, but I get segmentaion fault (11) when application starts. Is this code compatible with Tokyo? The other link in dropbox doesn't work. Thank you very much! Jordi Is the issue still actual? If yes, please send to me the fmx.jar file (by default path: "C:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release"). Thanks. Anatoliy, Rusland и #WAMACO 3 Цитата Ссылка на комментарий
0 Rusland Опубликовано 8 ноября, 2017 Поделиться Опубликовано 8 ноября, 2017 (изменено) В 04.11.2017 в 02:02, Fedor K сказал: Добавляем в .plist из комментария разрешения. Нашел этот .info.plist В нем указано: <dict> <key>NSAllowsArbitraryLoads</key><true/> </dict> Это и есть YES? В 04.11.2017 в 02:02, Fedor K сказал: Открываем FMX.WebBrowser.Delegate.iOS и правим TWebViewDelegate.shouldStartLoadWithRequest, запрещая загрузку при получении invalid сертификата Нельзя ли рассказать подробнее что конкретно и как править? Если честно, то не понял вообще что делать В 04.11.2017 в 02:02, Fedor K сказал: В методе didReceiveAuthenticationChallenge доверяем сертификату. didReceiveAuthenticationChallenge в FMX.WebBrowser.Delegate.iOS.pas нет (во всей директории source\fmx тоже). @Fedor K не могли вы выложить готовый пример с правками? Изменено 8 ноября, 2017 пользователем Rusland Цитата Ссылка на комментарий
0 Rusland Опубликовано 8 ноября, 2017 Поделиться Опубликовано 8 ноября, 2017 (изменено) Упоминания didReceiveAuthenticationChallenge есть в файлах: iOSapi.Foundation.pas, System.Net.HttpClient.Mac.pas, Macapi.Foundation.pas, Macapi.WebKit.pas Что со всем этим делать не ясно Изменено 8 ноября, 2017 пользователем Rusland Цитата Ссылка на комментарий
0 Rusland Опубликовано 8 ноября, 2017 Поделиться Опубликовано 8 ноября, 2017 В 04.11.2017 в 02:02, Fedor K сказал: есть ссылка #1 Ответ из этой ссылки #if DEBUG @implementation NSURLRequest (NSURLRequestWithIgnoreSSL) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host { return YES; } @end #endif позволяет в XCode работать с самоподписанными сертификатами. Всего пару строк добавил и заработало Хотелось бы так же просто и в FMX... или переходить на XCode? Цитата Ссылка на комментарий
0 Fedor K Опубликовано 8 ноября, 2017 Поделиться Опубликовано 8 ноября, 2017 5 часов назад, Rusland сказал: позволяет в XCode работать с самоподписанными сертификатами. Всего пару строк добавил и заработало Хотелось бы так же просто и в FMX... или переходить на XCode? Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко. Rusland 1 Цитата Ссылка на комментарий
0 Akad Опубликовано 9 ноября, 2017 Поделиться Опубликовано 9 ноября, 2017 Я бы просто прокси написал бы через id*, чем пытаться что-то с TWebBrowser серьёзное делать. Этот компонент просто не работает. И его НЕ ХОТЯТ отлаживать. Под винду он тупо падает после уничтожения компонента, под андроидом он после bwrowser.free остаётся висеть над родительской формой. Ни говоря о том, что кроме как через url с re-direct компонентом взаимодействовать не возможно.В своём текущем проекте с картографией я, похоже, выпилю полностью браузер, и воткну отображение png, так как ни под одной платформой TWebBrowser не работает вообще. TtmsfmxWebBrowser не настолько глючен, но всё равно рукалицо. Цитата Ссылка на комментарий
1 Fedor K Опубликовано 10 ноября, 2017 Поделиться Опубликовано 10 ноября, 2017 В 08.11.2017 в 22:01, Fedor K сказал: Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко. Objective-C конечно весьма специфический... Попробовал несколько методов, но решение действительно очень простое: 1. Меняем iOSapi.Foundation.pas: unit iOSapi.Foundation; //~3855 строка, добавляем 2 метода NSURLRequestClass = interface(NSObjectClass) ['{A93A4D14-529E-41F0-86EC-B570715512BB}'] {class} function requestWithURL(URL: NSURL): Pointer; cdecl; overload; {class} function requestWithURL(URL: NSURL; cachePolicy: NSURLRequestCachePolicy; timeoutInterval: NSTimeInterval): Pointer; cdecl; overload; //метод раз {class} function allowsAnyHTTPSCertificateForHost(host: NSString): Boolean; cdecl; overload; //метод два {class} procedure setAllowsAnyHTTPSCertificate(allow: Boolean; forHost: NSString); cdecl; overload; end; 2. В своем коде для требуемых сайтов пишем следующее: TNSURLRequest.OCClass.setAllowsAnyHTTPSCertificate(true, StrToNSStr(<требуемый сайт>)); Проверял на сайте expired.badssl.com, XCode 7 + SDK 9.3, Simulator, также на реальном устройстве с iOS 11. п.с. Если нужно доверять абсолютно всем сайтам, думаю можно п. 2 вставить в FMX.WebBrowser.Cocoa.pas в методе: procedure TCommonWebBrowserService.DoNavigate(const URL: string); enatechno, Anatoliy, #WAMACO и 1 другой 4 Цитата Ссылка на комментарий
0 Rusland Опубликовано 10 ноября, 2017 Поделиться Опубликовано 10 ноября, 2017 Проверил - отлично работает! Спасибо PS. XCode 7.3.1, iPhoneSimulator9.3.sdk Fedor K 1 Цитата Ссылка на комментарий
0 qz5 Опубликовано 1 декабря, 2018 Поделиться Опубликовано 1 декабря, 2018 В 04.11.2017 в 05:02, Fedor K сказал: Is the issue still actual? If yes, please send to me the fmx.jar file (by default path: "C:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release"). Thanks. Для меня актуально! Пытался сделать в 10.2.3 - не получилось Вышла 10.3, там вроде изменили код в Делфи, теперь он "из коробки": procedure TAndroidWebBrowserService.TWebBrowserListener.onReceivedSslError(view: JWebView; handler: JSslErrorHandler; error: JSslError); begin // Ignores expired SSL vertificate. handler.proceed; end; но всё равно на сайты с самоподписанными сертификатами не входит (может быть и с устаревшими не входит тоже). Прикрепляю fmx.jar из папки release. У меня не получилось изменить fmx.jar - видимо сказывается отсутствия знания java. Может выложите по шагам что надо сделать для изменения. WebClient.java то изменить несложно, но как его потом в WebClient.class собрать? Заранее спасибо. fmx.zip Цитата Ссылка на комментарий
Вопрос
SVTX
В интернете есть много сайтов с ошибочными или неверными ssl сертификатами.
При открытии данного сайта в других браузерах выдается сообщение о таком сертификате и предложение либо принять его либо отклонить.
В TWebBrowser никаких обработок нет и собственно по умолчанию сайт просто не отрывается.
Кто подскажет как можно решить данную проблему?
Ссылка на комментарий
26 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.