我已经在Xcode10中使用Swift开发了一个应用程序(应用程序名称:“ TerminalsPOC”)。我正在使用Alamofire向组织的内部网络api(我们将其称为网址“ https://example.com:50001/RESTAdapter/toolbox/getMyData”)发出https请求。我有一个带有类级变量的类来引用会话管理器:
// Swift code
let serverTrustPolicies: [String: ServerTrustPolicy] = [
“example.com": .pinCertificates(
certificates: ServerTrustPolicy.certificates(in: Bundle(for: type(of: self))),
validateCertificateChain: false,
validateHost: true
)
]
sessionManager = SessionManager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
sessionManager.request(url, method: .get) ...
我已将必要的.cer证书导入到应用程序的捆绑软件中。我保留了默认的ATS设置,但是添加了NSExceptionDomain。相关的info.plist部分看起来像
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<false/>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
只要NSExceptionAllowsInsecureHTTPLoads设置设置为true,此方法就起作用。如果将其设置为false,则请求将失败,并显示以下消息:发生SSL错误,无法建立与服务器的安全连接。 [-1200]
2018-12-07 11:55:42.122423-0700 TerminalsPOC [27191:371810] ATS失败 系统信任2018-12-07 11:55:42.122530-0700 TerminalsPOC [27191:371810]对于[2:0x600001fad740]的系统信任失败
2018-12-07 11:55:42.122637-0700 TerminalsPOC [27191:371810] TIC SSL 信任错误[2:0x600001fad740]:3:0
2018-12-07 11:55:42.125928-0700 TerminalsPOC [27191:371810] NSURLSession / NSURLConnection HTTP加载 失败(kCFStreamErrorDomainSSL,-9802)
2018-12-07 11:55:42.126109-0700 TerminalsPOC [27191:371810]任务 <54567E3C-2BBC-4227-9C0A-FC60370A10AA>。<1> HTTP加载失败(错误 代码:-1200 [3:-9802])
2018-12-07 11:55:42.126872-0700 TerminalsPOC [27191:371812]任务 <54567E3C-2BBC-4227-9C0A-FC60370A10AA>。<1>完成并出现错误-代码: -1200
2018-12-07 11:55:42.140600-0700 TerminalsPOC [27191:371810]任务<54567E3C-2BBC-4227-9C0A-FC60370A10AA>。<1>加载失败并出现错误 错误域= NSURLErrorDomain代码= -1200“发生SSL错误 并且无法建立与服务器的安全连接。” UserInfo = {NSLocalizedRecoverySuggestion =您要连接到 还是服务器?,_ kCFStreamErrorDomainKey = 3, NSErrorPeerCertificateChainKey =( “”, “”),NSErrorClientCertificateStateKey = 0, NSErrorFailingURLKey = https://example.com:50001/RESTAdapter/toolbox/getMyData, NSErrorFailingURLStringKey = https://example.com:50001/RESTAdapter/toolbox/getMyData, NSUnderlyingError = 0x6000024e89f0 {Error Domain = kCFErrorDomainCFNetwork 代码= -1200“(空)” UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0, kCFStreamPropertySSLPeerTrust =, _kCFNetworkCFStreamSSLErrorOriginalValue = -9802,_kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9802,kCFStreamPropertySSLPeerCertificates =( “”, “”}}},_NSURLErrorRelatedURLSessionTaskErrorKey =( “ LocalDataTask <54567E3C-2BBC-4227-9C0A-FC60370A10AA>。<1>”),_kCFStreamErrorCodeKey = -9802,_NSURLErrorFailingURLSessionTaskErrorKey = LocalDataTask <54567E3C-2BBC-4227-9C0A-FC60370A10AA>。<1>, NSURLErrorFailingURLPeerTrustErrorKey =, NSLocalizedDescription =发生SSL错误并且安全 无法建立与服务器的连接。} [-1200]
我尝试运行“ nscurl --ats-diagnostics https://example.com:50001/RESTAdapter/toolbox/getMyData”,响应包括以下内容:
默认ATS安全连接
--- ATS默认连接结果:通过
========
允许任意负载
---允许所有载荷结果:通过
==========为example.com配置TLS例外
--- TLSv1.3 2018-12-07 10:59:17.492 nscurl [24303:331847] NSURLSession / NSURLConnection HTTP加载失败
(kCFStreamErrorDomainSSL,-9800)结果:失败
--- TLSv1.2结果:通过
--- TLSv1.1结果:通过
--- TLSv1.0结果:通过
=============为example.com配置PFS例外
---禁用完美的前向保密结果:通过
===========例如,配置PFS例外并允许不安全的HTTP
---禁用完善的前向保密性并允许不安全的HTTP结果:通过
对我来说,这一切都很好。我一定很想念东西。
我的问题是:
1。。考虑到这是一个https请求(无重定向),为什么将NSExceptionAllowsInsecureHTTPLoads设置为true才能使调用正常进行?我认为此设置仅会影响http调用,而不会影响https调用。
2。。如何在不设置NSExceptionAllowsInsecureHTTPLoads的情况下运行此Web请求(这似乎是一种破解/变通方法,不是吗?)?
答案 0 :(得分:1)
在这种情况下,问题在于该应用程序正在未安装所需证书的模拟器上运行。
一旦安装并信任了正确的(根)证书,固定证书检查就会通过,然后可以将NSExceptionAllowsInsecureHTTPLoads
info.plist设置重新设置为“ NO”。
我希望错误消息更加明确。 :-/