• 0
SVTX

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

Вопросы

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 ответов на этот вопрос

  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да конечно. 

https://myhealth.catawbavalleymc.org

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

SVTX если не трудно, пожалуйста, поделитесь решением, очень нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Тоже ищу решения данной проблемы. Не открывается сайт с неверным сертификатом. Как обойти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

@Fedor K в вашем примере принимается любой SSL сертификат (даже просроченные)? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 минут назад, Rusland сказал:

@Fedor K в вашем примере принимается любой SSL сертификат (даже просроченные)? 

Да, любой сертификат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

 

В 05.06.2017 в 10:28, Fedor K сказал:

Да, любой сертификат.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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