HTTPS support for traccar manager (or client)

Andrew 4 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 Tananaev 4 years ago

Why is there a redirect?

Andrew 4 years ago

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

Andrew 4 years ago

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

Anton Tananaev 4 years ago

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

Andrew 4 years ago

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

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

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

Andrew 4 years ago

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

Anton Tananaev 4 years ago

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

Andrew 4 years ago

В ВК отправил

Andrew 4 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

Andrew 4 years ago

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

urlConnection = resourceUrl.openConnection() as HttpURLConnection

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

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

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

Anton Tananaev 4 years ago

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

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

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

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

Anton Tananaev 4 years ago

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