React-native java.security.cert.CertPathValidatorException: якорь доверия для пути сертификации не найден

Мое мобильное приложение React Native внезапно не может подключиться к серверной части. (только версия для Android, iOS работает без проблем). Также я могу запросить API без проблем с помощью браузера.

Это просто внезапно произошло, когда проблема началась там, где не было никаких изменений на стороне сервера или в мобильном приложении, но все приложения для Android перестают подключаться к серверу.

Исключение в мобильном приложении говорит: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Я просмотрел каждый ответ в Stack Overflow, но пока ничего не работает. Вот основные моменты:

  • Мое мобильное приложение сделано с использованием React-Native и Expo, SSL-сертификат выдан LetsEncrypt.
  • Сертификат из моего API правильный, он отлично работает с iOS и любым веб-браузером.
  • Бэкэнд — это react-js приложение, работающее с nginx 1.22.1 сервером.

В мобильном:

  • Я попробовал другое приложение (тестер API) для Android, и я получаю ту же ошибку, пытаясь связаться с моим API. (но опять же, мой ssl-сертификат кажется в порядке).
  • В моем мобильном приложении я привязался к выборке данных из случайного открытого API в Интернете, и он работает без проблем.
  • Я также пытался использовать fetch вместо axios, но также не смог подключиться.
  • Я тоже смотрю как сделать ssl сертификат pinning как временное решение но проблема в том что я использую expo и не нашел как это сделать с ним.

Некоторые соответствующие версии зависимостей:

"dependencies": {
    ...
    "axios": "^1.1.3",
    "expo": "^44.0.0",
    "expo-cli": "^5.4.3",
    "react": "17.0.1",
    "react-native": "0.64.3",
    "react-native-gesture-handler": "~2.1.0",
    ...
  },

На сервере:

  • Я пробовал с сертификатом, выданным ZeroSSL, но все еще имею ту же проблему.
  • Я также попытался добавить эмитента сертификата в «доверенные учетные данные» в Android, но этот эмитент уже был там.
  • Я также пытался обновить сертификат, используя certbot с флагом --preferred-chain="ISRG Root X1"

Учитывая весь этот тест, кажется, что это проблема на стороне сервера, но ни у одного другого устройства нет проблем с этим, только у Android; Также я проверяю сертификат, и все в порядке.

Я также тестирую сертификат с этим сайтом https://www.ssllabs.com/sstest

И это был результат

SSL-тест

Я буду благодарен за любую подсказку, которую вы можете мне дать.

С уважением!

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
3
0
507
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Больше контекста:

  • Мое мобильное приложение сделано React Native + Expo.
  • Я собрал версию для iOS и другую для Android.
  • Проблема просто внезапно возникла только в Android (На всех устройствах Android без каких-либо изменений в мобильном приложении или на сервере)
  • iOS может без проблем подключиться к API
  • Веб-сайт может без проблем обмениваться данными с API.

Похоже, это проблема библиотеки axios (конкретно axiosinstance). Это странно, потому что я ничего не менял в приложении для Android, оно просто внезапно перестало работать. (на всех устройствах Android одновременно).

И просто выполняя тесты, я понял, что axiosinstance терпит неудачу, выполняя запрос (за исключением того, что я уже показал вам), но необъяснимым образом, если первый запрос, указывающий на мой API, который я делаю в приложении, использует axios, он работает отлично , и после этого axiosinstance способен в обязательном порядке выполнить любой запрос к моему API.

Я знаю, это звучит странно, но теперь мое приложение снова работает.

С другой стороны, просто чтобы вы знали, я также протестировал приложение для Android под названием API Tester v5.6, и оно не может подключиться к моему API, что дает мне такое же исключение, но последняя версия API Tester 5.7 (которая была выпущена всего несколько дней назад) работает без проблем.

Я также пытался подключиться к своему API с помощью ApiClient v2.4.7, и это не удалось с тем же исключением.

Опять же, я не понимаю, в чем настоящая проблема, но определенно не в сертификате.

В любом случае, теперь вы знаете, может быть, я должен опубликовать эту проблему для парней axios?

С уважением!

У меня такая же проблема, но я не думаю, что это вызвано Axios. Вы пробовали тот же запрос, используя, например. XMLHttpRequest? Потому что это возвращает мне ту же ошибку.

Roman Šimr 28.11.2022 13:13

Другие вопросы по теме