HTTPS support for traccar manager (or client)

Andrew7 months ago

Hello!
I try to enable https on traccar server.
My architecture is:

<Random client> --internet--> <haproxy server> --LAN-->[docker-traccar]
On HaProxy configured 301 Redirect to https on 80 port, and reverse proxy to traccar backend by SNI name on 443 port.
All works from any browser. But android manager isn't works. I see error "No server connection".
After learn source code of manager app I see:
StartFragment.kt:

...
urlConnection = resourceUrl.openConnection() as HttpURLConnection
...

I'm not Java specialist, but I found in internet, that for HTTPS connection uses other class: HttpsURLConnection

Is manager can connect with https?

Anton Tananaev7 months ago

Why is there a redirect?

Andrew7 months ago

Не понял вопроса, напиши по-русски )

Andrew7 months ago

Если про 301й редирект - чтоб исключить нешифрованное соединение.

Anton Tananaev7 months ago

Но подключается вы к https напрямую, правильно?

Andrew7 months ago

Да, в настройках я указываю https://gps.serv.er

Anton Tananaev7 months ago
This site can’t be reached
Check if there is a typo in gps.serv.er.
DNS_PROBE_FINISHED_NXDOMAIN
Andrew7 months ago

Ну вернее как, напрямую... Всё равно трафик идёт через HaProxy, который как раз и предоставляет https

Andrew7 months ago

Этот адрес написал для примера, реальный адрес отправил лично

Anton Tananaev7 months ago

Адрес то сервера дадите посмотреть? Или гадать предлагаете?

Andrew7 months ago

В ВК отправил

Andrew7 months ago

Такое вижу в логе в момент подключения приложения:

2021-10-29T18:47:47 haproxy[53416] ip.add.re.ss:port [29/Oct/2021:18:47:47.294] HTTPS/0.0.0.0:443: SSL handshake failure

Аналогичную строку получаю, если явно укажу нешифрованый http на https порт, то есть, если в браузере укажу некорректную ссылку вида: http://gps.serv.er:443

Andrew7 months ago

Как я понимаю, в коде нужно поменять

urlConnection = resourceUrl.openConnection() as HttpURLConnection

На что-то типа:

if (url.matches("^https")){
urlConnection = resourceUrl.openConnection() as HttpsURLConnection
} else {
urlConnection = resourceUrl.openConnection() as HttpURLConnection
}

Если написал херню - сильно не критикуй, я не программист

Anton Tananaev7 months ago

Вот такую ошибку выдает:

javax.net.ssl.SSLHandshakeException: Unacceptable certificate: CN=R3, O=Let's Encrypt, C=US

Можно в логах ее найти.

На сколько я понимаю Android не принимает ваш сертификат как валидный.

Anton Tananaev7 months ago

Еще может быть проблема с цепочкой сертификатов. Например если intermediary отсутствует.