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. Если кому потребуется помощь - пишите, я помогу ответами и примером. Ingalime, Rusland, Kitty и 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. Rusland, #WAMACO и Anatoliy 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); Rusland, #WAMACO, Anatoliy и 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 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.