Перейти к содержанию
Fire Monkey от А до Я
  • 0

TWebBrowser и неверный ssl сертификат на сайте.


SVTX

Вопрос

В интернете есть много сайтов с ошибочными или неверными ssl сертификатами. 

При открытии данного сайта в других браузерах выдается сообщение о таком сертификате и предложение либо принять его либо отклонить.

В TWebBrowser никаких обработок нет и собственно по умолчанию сайт просто не отрывается.

Кто подскажет как можно решить данную проблему? 

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Неужели никто не сталкивался с такой проблемой?? она ведь нивелирует функционал TWebBrowser. Так как любой сертификат любимого сайта может истечь по сроку давности и вы уже не сможете зайти на него. Что же делать? 

Ссылка на комментарий
  • 0

Кое что накопал сам.

В юните FMX.WebBrowser.Android.pas есть метод TWebBrowserListener.onReceivedSslError.

По документации Андроид в нем можно обработать данную ошибку. Но команда proceed; не дает никакого результата((

Ссылка на комментарий
  • 0

Да конечно. 

https://myhealth.catawbavalleymc.org

 

К сожалению средствами Delphi X6 победить данную проблему не получилось. Переписывались исходники всего FMX.WebBrowser.Android.pas.

Пришлось полностью делать Активити на Java и вызывать его из Делфи приложения. 

Ссылка на комментарий
  • 1
В 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. Если кому потребуется помощь - пишите, я помогу ответами и примером.

12.PNG

Ссылка на комментарий
  • 0

Попробовал первым способом, подключил fmx.jar, отключил fmx.dex.jar, закинул в папку с проектом FMX.WebBrowser.Android.pas, внес в него вышеуказанные исправления.

При запуске программы вылетает First chance exception at $72DA3858. Exception class Segmentation fault (11). 

exception.png.eb1437c6879b7c87b1217d78d04de7b4.png

Почему так?

 

PS. Berlin, планшет Lenovo Android 5, телефон Xiaomi RN4 Android 6

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Дошло в чем у меня была проблема: оказалось что я в проект подкидывал FMX.WebBrowser.Android.pas из Токио, а не Берлина. Fedor K, cпасибо

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

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
  • Администраторы
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
В 06.10.2017 в 16:25, Rusland сказал:

 

А как решить эту проблему для iOS?

Думаю вполне реально. Пример обхода этой проблемы есть  ссылка #1 и ссылка #2. Методика следующая:

  1. Добавляем в .plist из комментария разрешения.
  2. Открываем FMX.WebBrowser.Delegate.iOS и правим TWebViewDelegate.shouldStartLoadWithRequest, запрещая загрузку при получении invalid сертификата.
  3. Создаем экземпляр NSURLConnection и выполняем тот же запрос.
  4. В методе didReceiveAuthenticationChallenge доверяем сертификату.
  5. Выполняем загрузку страницы в 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.

Ссылка на комментарий
  • 0
В 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 не могли вы выложить готовый пример с правками?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Упоминания didReceiveAuthenticationChallenge есть в файлах: iOSapi.Foundation.pas, System.Net.HttpClient.Mac.pas, Macapi.Foundation.pas, Macapi.WebKit.pas

Что со всем этим делать не ясно :)

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
В 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
5 часов назад, Rusland сказал:

позволяет в XCode работать с самоподписанными сертификатами. Всего пару строк добавил и заработало :)

Хотелось бы так же просто и в FMX... или переходить на XCode?  :)

Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.

Ссылка на комментарий
  • 0

Я бы просто прокси написал бы через id*, чем пытаться что-то с TWebBrowser серьёзное делать. Этот компонент просто не работает. И его НЕ ХОТЯТ отлаживать. Под винду он тупо падает после уничтожения компонента, под андроидом он после bwrowser.free остаётся висеть над родительской формой. Ни говоря о том, что кроме как через url с re-direct компонентом взаимодействовать не возможно.В своём текущем проекте с картографией я, похоже, выпилю полностью браузер, и воткну отображение png, так как ни под одной платформой TWebBrowser не работает вообще. TtmsfmxWebBrowser не настолько глючен, но всё равно рукалицо.
 

Ссылка на комментарий
  • 1
В 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);

 

Ссылка на комментарий
  • 0
В 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

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...