HTTPS support for traccar manager (or client)

Andrew3 years 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 Tananaev3 years ago

Why is there a redirect?

Andrew3 years ago

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

Andrew3 years ago

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

Anton Tananaev3 years ago

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

Andrew3 years ago

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

Anton Tananaev3 years ago
This site can’t be reached
Check if there is a typo in gps.serv.er.
DNS_PROBE_FINISHED_NXDOMAIN
Andrew3 years ago

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

Andrew3 years ago

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

Anton Tananaev3 years ago

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

Andrew3 years ago

В ВК отправил

Andrew3 years 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

Andrew3 years ago

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

urlConnection = resourceUrl.openConnection() as HttpURLConnection

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

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

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

Anton Tananaev3 years ago

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

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

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

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

Anton Tananaev3 years ago

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