Spring Boot Web / Tomcat отказывается подключаться к указанной сети c (Vodafone) - PullRequest
3 голосов
/ 21 июня 2020

Я использую Spring Boot + Spring Web в приложении для WebRT C Signaling. Он работает очень хорошо, и каждый, кто тестирует, может использовать его в своем браузере. Но я обнаружил один случай, когда один человек не смог подключиться к моему сервису через веб-сокеты. Этот человек использует TP-Link M7350, это мини-Wi-Fi роутер с SIM-картой (Vodafone) внутри. Я исследовал, отлаживал и пробовал несколько вещей в своем приложении, чтобы отловить ошибку. Но я узнал, что это не имеет ничего общего с моим приложением или веб-узлами, похоже, проблема с самой TomCat / Spring Boot. Мне удалось воспроизвести проблему с помощью этого простого веб-приложения с весенней загрузкой:

https://github.com/mxk1011/springboot-mini-demo

Это очень простое веб-приложение, которое выводит «Я жив» при доступе / тестировании в одном контроллере.

Я клонировал это приложение на fre sh сервере, не связанном ни с одним из моих приложений, открыв порт 443 с помощью ufw и запустив его с mvn -U clean spring-boot:run. Из всех различных сетей, которые я тестировал, я мог видеть «Я жив» при доступе / тестировании на сервере, я использовал разные Wi-Fi и точки доступа с мобильных телефонов. Но когда я переключился на WiFI этого маршрутизатора TP-Link с SIM-картой Vodafone, я получил:

ERR_CONNECTION_TIMED_OUT в моем Chrome и во всех других браузерах.

Я переключился подключите SIM-карту в маршрутизаторе к SIM-карте Telekom и перезапустите ее. Я смог зайти на страницу и увидеть «Я жив». Вставив карту Vodafone в свой мобильный телефон, я НЕ смог открыть страницу, а также получил тайм-аут. Когда я включил любую VPN на своем компьютере при подключении к маршрутизатору с помощью карты Vodafone, я смог получить к нему правильный доступ.

Итак, по какой-то причине эта единственная SIM-карта Vodafone вызывает то, что я не могу подключиться на этот мини-веб-сервер со ссылкой на Github выше.

Для лучшей отладки я изменил LOG LEVEL на TRACE. Вот что происходит, когда вы можете подключиться к странице:

https://github.com/mxk1011/springboot-mini-demo/blob/master/works.log

И это происходит, когда я подключаюсь с SIM-карты Vodafone к серверу :

https://github.com/mxk1011/springboot-mini-demo/blob/master/fails.log

В моем рабочем приложении я использую сертификат Let's Encrypt, в этом примере я использую самоподписанный ключ в магазине (см. github, это тот, который я использовал для тестирования). Использование сертификата Let's Encrypt на демонстрационном сервере ничего не меняет. Я тоже пробовал это.

Я понятия не имею, почему это может не работать. Человек, у которого мне достался роутер + симкарта, каждый день пользуется им по работе и никаких проблем с ним не имеет. Я также смог отправить sh файлы на GitHub и открыть с его помощью этот поток StackOverflow. В основном это демонстрационное приложение + моя собственная - единственные страницы, которые я обнаружил, которые с ним не работают. В понедельник я пойду go в розничный магазин и куплю еще одну SIM-карту Vodafone, чтобы узнать, является ли это общей проблемой Vodafone или какой-либо другой c этой SIM-карты - я должен сказать, что здесь я не эксперт с этим вопросом. Поэтому я открываю эту ветку здесь и надеюсь, что у кого-то есть идеи, как я могу решить эту проблему, потому что, когда это происходит на одном устройстве / маршрутизаторе, это может случиться на многих, и мне нужно, чтобы мой сервис был доступен для всех клиентов. Заранее спасибо всем, я надеюсь, что предоставленная информация может помочь.

EDIT Я знаю, что вполне вероятно, что что-то между устройствами, от Vodafone до приложения блокирует запрос и не в чем винить Spring web / boot. Но, как вы можете видеть в журналах, есть входящий запрос с моего IP-адреса от маршрутизатора. Если у вас, возможно, нет решения моей проблемы, возможно, у вас есть идея, что могло бы помочь узнать об этом больше, возможно, используя какой-либо инструмент / скрипт на сервере / клиенте? Я открыт для любых идей. Спасибо!

РЕДАКТИРОВАТЬ 2 Чтобы доказать, что ничто в середине не блокирует, я установил простой nginx сервер с https на той же машине и открыл его на порту 443. С помощью Маршрутизатор + SIM-карта Vodafone Мне удалось подключиться к нему по https. Так что мне действительно кажется, что точкой отказа является часть Spring / Java.

EDIT 3 Теперь я попытался получить доступ к серверу через curl -vvv, чтобы, возможно, получить дополнительную информацию с помощью этой команды. Я получил доступ к серверу с его помощью, но получил такой ответ:

*   Trying 1.2.3.x...
* TCP_NODELAY set
* Connected to xxx.com (1.2.3.x) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self signed certificate
* Closing connection 0
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Достаточно честно, мне нужен сертификат. Я добавил скрипт для получения сертификата Let's encrypt и преобразования его в pkcs12 в git выше. После его создания я скопировал его в путь к классам и начал снова. Я снова сделал curl -vvv myhost.com, и мне удалось получить доступ без проблем:

*   Trying x.x.x.x...
* TCP_NODELAY set
* Connected to myhost.com (x.x.x.x) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=myhost.com
*  start date: Jun 21 10:08:36 2020 GMT
*  expire date: Sep 19 10:08:36 2020 GMT
*  subjectAltName: host "myhost.com" matched cert's "myhost.com"
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.
> GET /test HTTP/1.1
> Host: myhost.com
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 11
< Date: Sun, 21 Jun 2020 11:11:27 GMT
< 
* Connection #0 to host myhost.com left intact
I am alive!* Closing connection 0

Это работает при открытии того же URL-адреса в любом браузере, НЕ ИСПОЛЬЗУЕТСЯ с этой SIM-картой. Со всеми остальными сетями проблем нет.

1 Ответ

4 голосов
/ 23 июня 2020

После долгой отладки я наконец нашел решение. Видимо, по какой-то причине сеть Vodafone блокировала подключения к серверам, на которых выполняются мои приложения с SSL. Добавив следующее в свойства приложения, он наконец пропустил запросы:

server.ssl.ciphers=ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384
server.http2.enabled=true

Надеюсь, это поможет кому-то еще, столкнувшемуся с подобными проблемами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...