Public Swift 中的关键固定 2
Public Key Pinning in Swift 2
我可以使用以下函数与服务器建立 HTTP 连接。
func isHostConnected(jsonString:NSDictionary, var retryCounter: Int) -> NSDictionary
{
let request = NSMutableURLRequest(URL: NSURL(string: "http://***.*.*.**:****/")!)
do {
request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(jsonString, options: [])
} catch {
//error = error1
request.HTTPBody = nil
}
request.timeoutInterval = 45.0 //(number as! NSTimeInterval)
request.HTTPMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("gzip", forHTTPHeaderField: "Accept-encoding")
var JSONdata: AnyObject = ["" : ""] as Dictionary<String, String>
//print(JSONdata)
if retryCounter == 0 {
JSONdata = ["0" : "0"] as Dictionary<String, String>
return (JSONdata) as! NSDictionary
}
retryCounter--
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
var responseCode = -1
let group = dispatch_group_create()
dispatch_group_enter(group)
print("session.dataTaskWithRequest")
delayTimer(1.0){
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if let httpResponse = response as? NSHTTPURLResponse {
responseCode = httpResponse.statusCode
let JSONresdata: AnyObject = (try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers))
JSONdata = JSONresdata as! NSDictionary
}
dispatch_group_leave(group)
}).resume()
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
print("responseCode == 200: \(responseCode)")
if responseCode != 200 {
print("retryCounter: \(retryCounter)")
self.isHostConnected(jsonString,retryCounter: retryCounter)
}
return (JSONdata) as! NSDictionary
}
现在在同一个函数中,我们要建立 HTTPS 连接,我有一个 自签名证书 。我想知道要实现 public 密钥固定,我需要遵循哪些步骤来使用我的自签名证书来编写这段代码。
我在互联网上进行了搜索,但在 NSURLSession 和 swift 2 中没有找到与此相关的示例或代码段。请帮我解决这个问题。
以下代码可能会有帮助:link
import UIKit
import Foundation
class ViewController: UIViewController, NSURLSessionDelegate {
override func viewDidLoad() {
super.viewDidLoad()
httpGet(NSMutableURLRequest(URL: NSURL(string: "https://example.com")!))
}
func httpGet(request: NSMutableURLRequest!) {
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
}).resume()
}
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!))
}
}
我可以使用以下函数与服务器建立 HTTP 连接。
func isHostConnected(jsonString:NSDictionary, var retryCounter: Int) -> NSDictionary
{
let request = NSMutableURLRequest(URL: NSURL(string: "http://***.*.*.**:****/")!)
do {
request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(jsonString, options: [])
} catch {
//error = error1
request.HTTPBody = nil
}
request.timeoutInterval = 45.0 //(number as! NSTimeInterval)
request.HTTPMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("gzip", forHTTPHeaderField: "Accept-encoding")
var JSONdata: AnyObject = ["" : ""] as Dictionary<String, String>
//print(JSONdata)
if retryCounter == 0 {
JSONdata = ["0" : "0"] as Dictionary<String, String>
return (JSONdata) as! NSDictionary
}
retryCounter--
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
var responseCode = -1
let group = dispatch_group_create()
dispatch_group_enter(group)
print("session.dataTaskWithRequest")
delayTimer(1.0){
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if let httpResponse = response as? NSHTTPURLResponse {
responseCode = httpResponse.statusCode
let JSONresdata: AnyObject = (try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers))
JSONdata = JSONresdata as! NSDictionary
}
dispatch_group_leave(group)
}).resume()
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
print("responseCode == 200: \(responseCode)")
if responseCode != 200 {
print("retryCounter: \(retryCounter)")
self.isHostConnected(jsonString,retryCounter: retryCounter)
}
return (JSONdata) as! NSDictionary
}
现在在同一个函数中,我们要建立 HTTPS 连接,我有一个 自签名证书 。我想知道要实现 public 密钥固定,我需要遵循哪些步骤来使用我的自签名证书来编写这段代码。
我在互联网上进行了搜索,但在 NSURLSession 和 swift 2 中没有找到与此相关的示例或代码段。请帮我解决这个问题。
以下代码可能会有帮助:link
import UIKit
import Foundation
class ViewController: UIViewController, NSURLSessionDelegate {
override func viewDidLoad() {
super.viewDidLoad()
httpGet(NSMutableURLRequest(URL: NSURL(string: "https://example.com")!))
}
func httpGet(request: NSMutableURLRequest!) {
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
}).resume()
}
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!))
}
}