仅当NSExceptionAllowsInsecureHTTPLoads设置为true时,Alamofire https请求才有效

时间:2018-12-07 20:49:21

标签: swift xcode ssl alamofire app-transport-security

我已经在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请求(这似乎是一种破解/变通方法,不是吗?)?

1 个答案:

答案 0 :(得分:1)

在这种情况下,问题在于该应用程序正在未安装所需证书的模拟器上运行。

一旦安装并信任了正确的(根)证书,固定证书检查就会通过,然后可以将NSExceptionAllowsInsecureHTTPLoads info.plist设置重新设置为“ NO”。

我希望错误消息更加明确。 :-/