Подтвердить что ты не робот

Игнорировать ошибки для самоподписанных сертификатов SSL, используя API-интерфейс Fetch в приложении ReactNative?

Я создаю небольшое приложение iOS ReactNative. В нем я использую API-интерфейс fetch для простого запроса запроса на сервер, который я контролирую, который имеет действительный, но самоподписанный сертификат SSL. Понятно, что это вызывает ошибку.

Между iOS/JSC я не уверен, как (или что!) я могу настроить для моего приложения игнорировать эту ошибку - все ответы, которые я нашел до сих пор, связаны с решениями Objective-C, я ищу для чего-то, что я могу использовать с окружающей средой АО.

4b9b3361

Ответ 1

Я столкнулся с этой же проблемой. Как вы отметили, кажется, что единственный способ заставить родное приложение iOS работать с самозаверяющим сертификатом - это написать/изменить код Objective-C, что не является хорошим подходом для разработчика JavaScript с использованием React Native. По этой причине, я думаю, ваш вопрос - это проблема X/Y, и я предлагаю решить вашу общую проблему с помощью другого подхода от использования собственной -значный сертификат в первую очередь.

Вместо этого я использую настоящий сертификат для разработки. Вот что я сделал, чтобы получить свой локальный API-интерфейс разработки с SSL и React Native. Это бесплатно и просто.

  • ssh на ваш общедоступный сервер, с которым связан ваш домен
  • установить letsencrypt
  • создать сертификат для ваших поддоменов разработки
    • dev.my-domain.com для разработки моего веб-сайта/webapp локально
    • api.dev.my-domain.com для api
    • ./letsencrypt-auto certonly --standalone -d dev.my-domain.com -d api.dev.my-domain.com
  • скопируйте файл fullchain.pem и privkey.pem на свою локальную машину
    • возможно, найден в /etc/letsencrypt/live/dev.my-domain.com
    • один способ получить файлы с вашего удаленного компьютера: scp -r [email protected](...):/etc/letsencrypt/live/dev.my-domain.com ./
  • замените свой самозаверяющий сертификат на fullchain.pem и privkey.pem
  • point dev.your-domain.com и другие субдомены, которые вы используете для вашей машины разработки ip
    • вы можете изменить свой файл hosts на каждом компьютере, который вы хотите использовать в домене
    • Если ваш маршрутизатор имеет dnsmasq, вы можете сделать что-то вроде address=/dev.my-domain.com/192.168.(...) для всей сети (я рекомендую это)

В этот момент, поскольку вы используете настоящий доверенный сертификат для домена, к которому вы обращаетесь, теперь api теперь будет доверять браузерам и устройствам в разработке!

Ответ 2

Отказ от ответственности: это решение должно быть временным и документированным, чтобы оно не оставалось на стадии производства программного обеспечения, это только для разработки.

Для iOS все, что вам нужно сделать, - откройте свой xcodeproject (внутри вашей папки iOS в RN), как только вы откроете это, перейдите в RCTNetwork.xcodeproj и в этом проекте перейдите к RCTHTTPRequestHandler.m

В этом файле вы увидите следующую строку:

 #pragma mark - NSURLSession delegate

сразу после этой строки добавьте эту функцию

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
  completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}

И теперь вы можете сделать небезопасные вызовы для вашего API без действительного сертификата.

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

и в конце просто добавьте

<key>NSAppTransportSecurity</key>
  <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
  </dict>

поэтому ваш файл будет выглядеть следующим образом

    ...
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string></string>
  <key>NSAppTransportSecurity</key>
  <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
  </dict>
</dict>
</plist>

Для реального готового решения для производства fooobar.com/questions/333876/... это решение лучше

Ответ 3

Этот ответ работает для Android.

  • найдите OkHttpClientProvider.java на node_modules\react-native\ReactAndroid\src\main\java\com\facebook\react\modules\network.

  • компиляция ReactAndroid использует NDK