Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSURLSERSESSION HTTPS自签名-请求从未到达服务器_Swift_Https_Django Rest Framework_Nsurlsession_Self Signed - Fatal编程技术网

Swift NSURLSERSESSION HTTPS自签名-请求从未到达服务器

Swift NSURLSERSESSION HTTPS自签名-请求从未到达服务器,swift,https,django-rest-framework,nsurlsession,self-signed,Swift,Https,Django Rest Framework,Nsurlsession,Self Signed,对django rest api执行HTTPS post请求时遇到问题。我让django sslserver运行以公开端口8000上的api。当我在浏览器https://server-ip-addr:8000/api_view/我的浏览器抱怨“嘿!这家伙的证书是自签名的!”我说“是的,我知道,就是我”,然后继续进行危险的回应 class SecureLogin: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate { fun

对django rest api执行HTTPS post请求时遇到问题。我让django sslserver运行以公开端口8000上的api。当我在浏览器
https://server-ip-addr:8000/api_view/
我的浏览器抱怨“嘿!这家伙的证书是自签名的!”我说“是的,我知道,就是我”,然后继续进行危险的回应

class SecureLogin: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate {

    func attemptLogin(username: String, password: String,
        callback: ((NSData!,NSURLResponse!,NSError!) -> Void)?) {
        
            println("inside attempt login")
        
            var request = NSMutableURLRequest(URL: NSURL(string: "https://147.222.164.91:8000/ldapauth/")!)
            request.HTTPMethod = "POST"

        
            var params = ["username":username, "password":password] as Dictionary<String, String>
        
            var err: NSError?
            request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue("application/json", forHTTPHeaderField: "Accept")
        
            var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
            var session = NSURLSession(configuration: configuration,
                delegate: self,
                delegateQueue:NSOperationQueue.mainQueue())
            var task = session.dataTaskWithRequest(request,callback)
        
            task.resume()
    }

    func URLSession(session: NSURLSession,
        didReceiveChallenge challenge: NSURLAuthenticationChallenge,
        completionHandler: (NSURLSessionAuthChallengeDisposition,NSURLCredential!) -> Void) {
            println("Challenge received")
            completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust))
    }

    func URLSession(session: NSURLSession,
        task: NSURLSessionTask,
        willPerformHTTPRedirection response: NSHTTPURLResponse,
        newRequest request: NSURLRequest,
        completionHandler: (NSURLRequest!) -> Void) {
            println("Redirection received")
            var newRequest : NSURLRequest? = request
            println(newRequest?.description)
            completionHandler(newRequest)
    }
}
无论如何,我正在尝试在iOS应用程序的Swift中执行相同的操作。我在实现
NSURLSession
委托协议/函数
nsurlsessionelegate.URLSession()
NSURLSessionTaskDelegate.URLSession()时发现了这一点。我对示例进行了调整,使其能够自动执行对sslserver的登录尝试

我在下面的代码中这样做了,这是一个实现上述两个协议的类,旨在将用户名/密码凭据传递给服务器并等待响应

class SecureLogin: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate {

    func attemptLogin(username: String, password: String,
        callback: ((NSData!,NSURLResponse!,NSError!) -> Void)?) {
        
            println("inside attempt login")
        
            var request = NSMutableURLRequest(URL: NSURL(string: "https://147.222.164.91:8000/ldapauth/")!)
            request.HTTPMethod = "POST"

        
            var params = ["username":username, "password":password] as Dictionary<String, String>
        
            var err: NSError?
            request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue("application/json", forHTTPHeaderField: "Accept")
        
            var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
            var session = NSURLSession(configuration: configuration,
                delegate: self,
                delegateQueue:NSOperationQueue.mainQueue())
            var task = session.dataTaskWithRequest(request,callback)
        
            task.resume()
    }

    func URLSession(session: NSURLSession,
        didReceiveChallenge challenge: NSURLAuthenticationChallenge,
        completionHandler: (NSURLSessionAuthChallengeDisposition,NSURLCredential!) -> Void) {
            println("Challenge received")
            completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust))
    }

    func URLSession(session: NSURLSession,
        task: NSURLSessionTask,
        willPerformHTTPRedirection response: NSHTTPURLResponse,
        newRequest request: NSURLRequest,
        completionHandler: (NSURLRequest!) -> Void) {
            println("Redirection received")
            var newRequest : NSURLRequest? = request
            println(newRequest?.description)
            completionHandler(newRequest)
    }
}
我让线程休眠25秒,以使进程保持足够长的活动时间,以便响应进入

控制台上的输出如下所示:

内部尝试登录

开始等待

然后程序死机,没有收到响应/“Internal gatekeeper”消息,我的django服务器终端也没有显示任何收到的请求。我运行了一个健全性检查:我已经注释掉了委托方法的实现,服务器接收到请求,响应为:

内部尝试登录

开始等待

2015-01-27 11:29:37.192 LdapAuthSecure[12783:1475994]NSURLConnection/CFURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9812)

没有用于处理授权质询的协议时的预期错误


有人能发现我执行NSURLSession或其代表的任何问题吗?我觉得很奇怪,请求甚至没有到达服务器。谢谢你的帮助

所以我从未为iOS编写过代码,但我从内存中知道,默认情况下,本机应用程序不会弹出对话框,也不会接受自签名证书

如果您拥有一个域(或者如果没有,可能更容易),您可以从或获得免费证书

或者,您可以通过将自签名证书通过电子邮件发送到手机,然后打开它来安装该证书

您可以从“设置”中的“配置文件”页面中删除自签名证书

我也为你找到了这个答案:
但这看起来会禁用验证。

如果这是iOS 9,并且如果您是根据iOS 9(或更高版本)SDK构建应用程序,您还必须调整Info.plist文件,以告知它允许不安全的加载。否则,URL加载系统将无法调用您的身份验证处理程序