Ios 自签名本地证书上的alamofire SSL错误

Ios 自签名本地证书上的alamofire SSL错误,ios,swift,ssl,https,alamofire,Ios,Swift,Ssl,Https,Alamofire,我有一个带有自签名证书的HTTP REST服务器。我想通过iOS Swift应用程序,使用alamofire与此服务器通话。我目前拥有的代码是: ``` 对于上面的代码片段,当我尝试进行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:

我有一个带有自签名证书的HTTP REST服务器。我想通过iOS Swift应用程序,使用alamofire与此服务器通话。我目前拥有的代码是:

```

对于上面的代码片段,当我尝试进行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
2017-12-30 18:24:20.114486+0530 myApp[58036:2721102]ATS系统信任失败
2017-12-30 18:24:20.114625+0530 myApp[58036:2721102]对[1:0x600000178a80]的系统信任失败
2017-12-30 18:24:20.114814+0530 myApp[58036:2721102]TIC SSL信任错误[1:0x600000178a80]:3:0
2017-12-30 18:24:20.115142+0530 myApp[58036:2721102]NSURLSession/NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9802)
2017-12-30 18:24:20.115274+0530 myApp[58036:2721102]任务。HTTP加载失败(错误代码:-1200[3:-9802])
2017-12-30 18:24:20.115469+0530 myApp[58036:272123]任务。完成时出现错误-代码:-1200
你知道怎么修吗?如果端口8000上的url是
localhost
,我不希望进行任何检查。我甚至尝试过将端口添加到
serverTrustPolicies
定义中,但这没有任何区别,而且仍然会出错。有什么帮助吗


更新:我认为我的问题与此有关,但尚未找到解决方法。

我已经找到了解决方法。我们需要编辑Info.plist文件并添加以下部分:

<key>NSAppTransportSecurity</key>
<dict>
        <key>NSAllowsLocalNetworking</key>
        <true/>
</dict>
NSAppTransportSecurity
NSAllowsLocalNetworking
允许iOS允许本地网络无https错误。

1。

在提供端口时,修改服务器信任策略的方法应该有效。另见。也许您正在使用模拟器测试应用程序,并尝试连接到同一台机器上的web服务器?这可能会导致各种各样的连接问题(或者您为什么还要尝试连接到本地主机?)

2.

您应该永远不要设置
NSAllowsLocalNetworking
或类似参数。它破坏了SSL,您永远不知道会发生什么,即使在本地网络中也是如此。如果绝对必要,您应该只为上述单个主机和端口设置例外

3.

您不应该使用自签名证书,因为这也会破坏SSL。使用证书获取有效证书非常容易。但是,在某些情况下,无法获得有效的证书。然后,您应该创建自己的证书颁发机构,并将CA根证书导出到您的设备。这样,您还可以只对一个特定主机进行例外


请注意,安全性在所有应用程序中都至关重要。只有在你确切知道自己在做什么的情况下,才能例外。

我也面临同样的问题。我发现了什么,什么有效:

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
}()

您是否尝试为
服务器TrustPolicyManager
创建自定义类?能否详细说明?我无法理解你的意思。>1这已经不起作用了(至少适用于swift 4.0和Mac OS 10.13.2)。这是为了我当地的发展而不是生产。>2设置NSAllowsLocalNetworking仅为本地主机访问而不是任何其他服务器放宽SSL严格性。>3我无法使用letsencrypt获取本地主机的证书,可以吗?如果我只想专注于笔记本电脑的本地开发,那么创建一个新的CA就太复杂了。通过设置NSAllowsLocalNetworking是否存在我所缺少的任何潜在漏洞?通过阅读那些文件,我找不到这样的东西。我错过什么了吗?谢谢。1.:您是否尝试使用IP地址而不是“localhost”?您是否尝试使用外部设备而不是模拟器?2:在所有情况下都应避免不加密的网络通信。3:您需要一个静态IP地址才能获得有效的证书。
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
}()