【问题标题】:SSL error when trying to use API connection in Swift尝试在 Swift 中使用 API 连接时出现 SSL 错误
【发布时间】:2020-03-29 10:43:38
【问题描述】:

谁能告诉我为什么会出现连接错误? 我可以通过浏览器访问 API URL,但是当我的应用程序尝试建立连接时,会出现错误。是我的网络吗?我的机器上需要某种证书吗?

【问题讨论】:

  • 显示您的 ATS 配置。
  • @Gereon,见下文:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>openweathermap.org</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>

标签: ios swift xcode ssl ssl-certificate


【解决方案1】:

我终于按照以下步骤解决了这个问题:

#1。在 iOS 模拟器上安装 Zscaler Root CA 并启用完全信任

一个。从我的 MAC 钥匙串中导出 Zscaler 根 CA

b.将导出的证书拖放到我在 iPhone 模拟器中构建的 Xcode(这将启动安装)

c。转到(在模拟器中)General Settings -> About -> Certificate Trust Settings 并为 Zscaler Root CA 启用 完全信任

#2。在 Xcode 项目中添加 NSAllowsArbitraryLoads

一个。将附加密钥添加到项目的 info.plist 配置文件中

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

【讨论】:

  • 谢谢,有一个稍微不同的错误,但根本原因相同:Error Domain=NSURLErrorDomain Code=-1202“此服务器的证书无效。您可能正在连接到假装的服务器是“”,这可能会使您的机密信息面临风险。” UserInfo={NSLocalizedRecoverySuggestion=您还是要连接到服务器吗?, _kCFStreamErrorDomainKey=3, NSErrorPeerCertificateChainKey=( " i: Zscaler Intermediate Root CA (zscalerthree.net) (t) >" ,...
【解决方案2】:

跟踪显示到 openweathermap.org 的连接是通过 ZScaler 安全代理传递的,该代理取代了根 CA,以拦截和分析流量。由于此站点的应用程序不信任此根 CA,因此连接失败。如需更多信息,请参阅Public Key Pinning (PKP) and Zscaler

【讨论】:

  • 嗨史蒂芬。我查看了您提供的链接,但我仍然不知道如何解决此问题。我需要调整 Mac 上的设置以绕过代理设置吗?这是错误应对的Xcode..还有..我猜我需要在机器上拥有管理员权限才能修复它?非常感谢您的帮助 - 我对网络的东西完全没用。
  • 仅供参考 - 我也尝试更新项目的 info.plist 文件以包含 NSAppTransportSecurity > NSExceptionAllowsInsecureHTTPLoads 但仍然是同样的问题:(
  • @marika.daboja:不幸的是,您的应用程序几乎一无所知。但问题是它会返回一个意外的 HTTPS 证书,这意味着 NSExceptionAllowsInsecureHTTPLoads 将无济于事,因为这意味着将允许纯 HTTP,但对 HTTPS 只字未提。根据您的应用程序,您需要在手机中将 ZScaler CA 导入为受信任(可能已经完成)并禁用证书固定。没有“绕过代理设置”,但您必须正确处理 SSL 拦截代理(即信任它)。
  • Steffen,给你一些背景知识:这是一个简单的天气应用程序,它允许用户输入位置,即。伦敦,然后应用程序将显示当前温度,即。 21'C 这是从 OpenWeatherMap.org API 获取的数据。我已经实现了 API URL let weatherURL = "https://api.openweathermap.org/data/2.5/weather?appid={id}&units=metric",然后我添加了函数来将此 URL 附加到用户键入的位置。
  • @marika.daboja:同样,“绕过”是没有办法的,但你必须正确处理拦截。这意味着删除 ZScaler Root CA 是完全错误的做法,因为它只会导致更多应用程序和您的浏览器失败。相反,您可能需要将 ZScaler Root CA 安装到您的模拟器中 - 请参阅 developer.apple.com/library/archive/qa/qa1948/_index.html。再说一次,我对您的应用程序了解得不够多,无法了解这是否真的足够。如果您有证书固定,那么这还不够。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2021-11-09
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多