Я использую 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-картой. Со всеми остальными сетями проблем нет.