Swift NSURLSERSESSION HTTPS自签名-请求从未到达服务器
对django rest api执行HTTPS post请求时遇到问题。我让django sslserver运行以公开端口8000上的api。当我在浏览器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
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加载系统将无法调用您的身份验证处理程序