我有一个带有自签名证书的HTTP REST服务器。我想使用alamofire从iOS Swift应用程序与此服务器通信。我当前的代码是:
```
let Almgr : Alamofire.SessionManager = {
// Create the server trust policies
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"localhost": .disableEvaluation
]
// Create custom manager
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
let man = Alamofire.SessionManager(
configuration: URLSessionConfiguration.default,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
return man
}()
Almgr.request(url, method: .post, parameters: params).responseJSON {
response in
if response.result.isSuccess {
print("Success")
} else {
print("Failure")
}
}
使用上面的代码段,当我尝试进行http调用Almgr.request
时,我总是收到错误消息。错误消息是:
2017-12-30 18:24:20.114486+0530 myApp[58036:2721102] ATS failed system trust
2017-12-30 18:24:20.114625+0530 myApp[58036:2721102] System Trust failed for [1:0x600000178a80]
2017-12-30 18:24:20.114814+0530 myApp[58036:2721102] TIC SSL Trust Error [1:0x600000178a80]: 3:0
2017-12-30 18:24:20.115142+0530 myApp[58036:2721102] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
2017-12-30 18:24:20.115274+0530 myApp[58036:2721102] Task <4E3D9E88-B9CE-48C4-850C-5A3E7C9A6A72>.<1> HTTP load failed (error code: -1200 [3:-9802])
2017-12-30 18:24:20.115469+0530 myApp[58036:2721231] Task <4E3D9E88-B9CE-48C4-850C-5A3E7C9A6A72>.<1> finished with error - code: -1200
知道怎么修这个吗?如果端口8000上的网址为localhost
,我不希望进行任何检查。我甚至尝试将端口添加到serverTrustPolicies
定义,但这没有任何区别,我仍然会收到错误。有什么帮助吗?
更新:我认为我的问题与https://developer.apple.com/library/content/qa/qa1948/_index.html有关,但尚未找到修复方法。
答案 0 :(得分:1)
<强> 1 强>
在提供端口时,您修改服务器信任策略的方法应该有效。另请参阅this post。也许您正在使用模拟器测试您的应用程序并尝试连接到同一台计算机上的Web服务器?这可能会导致各种连接问题(或者为什么要尝试连接到localhost?)。
<强> 2 强>
您应永远设置# A tibble: 9 x 3
variable_name W `p-value`
<chr> <dbl> <dbl>
1 carb 0.851 0.000438
2 cyl 0.753 0.00000606
3 disp 0.920 0.0208
4 drat 0.946 0.110
5 gear 0.773 0.0000131
6 hp 0.933 0.0488
7 mpg 0.948 0.123
8 qsec 0.973 0.594
9 vs 0.632 0.0000000974
或类似参数。它打破了SSL,你甚至不知道会发生什么,即使在本地网络中也是如此。如果绝对必要,您应该如上所述为单个主机和端口设置例外。
第3 强>
您永远不应该使用自签名证书,因为这也会破坏SSL。使用Let's Encrypt获取有效证书非常容易。但是,在某些情况下,无法获得有效的证书。然后,您应该创建自己的证书颁发机构并将CA根证书导出到您的设备。这样,您也只对一个特定主机进行例外处理。
请注意,安全性在所有应用程序中都至关重要。如果你确切知道自己在做什么,请只做例外。
答案 1 :(得分:0)
我已经找到了解决方案。我们需要编辑Info.plist文件并添加以下部分:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
让iOS允许没有https错误的本地网络。
答案 2 :(得分:0)
我遇到了同样的问题。我弄清楚了什么以及它的作用:
let almgr:Alamofire.SessionManager = {
//getcertificates is my own method where i create certificate with data from my .cer file
let certificates = getCertificates()
let trustPolicy = ServerTrustPolicy.pinCertificates(certificates: certificates, validateCertificateChain: true, validateHost: true)
// Here was the problem. I had to modify that dict: (localhost with port and with .disableEvaluation)
let serverTrustPolicies = ["liper:8000":trustPolicy, "liper":.disableEvaluation]
let serverTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies)
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
let man = Alamofire.SessionManager(configuration: URLSessionConfiguration.default, serverTrustPolicyManager: serverTrustPolicyManager)
return man
}()