Created
May 10, 2016 08:56
-
-
Save bleft/34beb949a3a7f57ee4edd4bccf2100f0 to your computer and use it in GitHub Desktop.
URLSession Delegate for authentication challenge
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { | |
if challenge.protectionSpace.authenticationMethod == (NSURLAuthenticationMethodServerTrust) { | |
let serverTrust:SecTrustRef = challenge.protectionSpace.serverTrust! | |
let certificate: SecCertificateRef = SecTrustGetCertificateAtIndex(serverTrust, 0)! | |
let remoteCertificateData = CFBridgingRetain(SecCertificateCopyData(certificate))! | |
let cerPath: String = NSBundle.mainBundle().pathForResource("xyz.com", ofType: "cer")! | |
let localCertificateData = NSData(contentsOfFile:cerPath)! | |
if (remoteCertificateData.isEqualToData(localCertificateData) == true) { | |
let credential:NSURLCredential = NSURLCredential(forTrust: serverTrust) | |
challenge.sender?.useCredential(credential, forAuthenticationChallenge: challenge) | |
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) | |
} else { | |
completionHandler(NSURLSessionAuthChallengeDisposition.CancelAuthenticationChallenge, nil) | |
} | |
} | |
else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate | |
{ | |
let path: String = NSBundle.mainBundle().pathForResource("client", ofType: "p12")! | |
let PKCS12Data = NSData(contentsOfFile:path)! | |
let identityAndTrust:IdentityAndTrust = self.extractIdentity(PKCS12Data); | |
let urlCredential:NSURLCredential = NSURLCredential( | |
identity: identityAndTrust.identityRef, | |
certificates: identityAndTrust.certArray as? [AnyObject], | |
persistence: NSURLCredentialPersistence.ForSession); | |
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, urlCredential); | |
} | |
else | |
{ | |
completionHandler(NSURLSessionAuthChallengeDisposition.CancelAuthenticationChallenge, nil); | |
} | |
} | |
struct IdentityAndTrust { | |
var identityRef:SecIdentityRef | |
var trust:SecTrustRef | |
var certArray:AnyObject | |
} | |
func extractIdentity(certData:NSData) -> IdentityAndTrust { | |
var identityAndTrust:IdentityAndTrust! | |
var securityError:OSStatus = errSecSuccess | |
let path: String = NSBundle.mainBundle().pathForResource("client", ofType: "p12")! | |
let PKCS12Data = NSData(contentsOfFile:path)! | |
let key : NSString = kSecImportExportPassphrase as NSString | |
let options : NSDictionary = [key : "xyz"] | |
//create variable for holding security information | |
//var privateKeyRef: SecKeyRef? = nil | |
var items : CFArray? | |
securityError = SecPKCS12Import(PKCS12Data, options, &items) | |
if securityError == errSecSuccess { | |
let certItems:CFArray = items as CFArray!; | |
let certItemsArray:Array = certItems as Array | |
let dict:AnyObject? = certItemsArray.first; | |
if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> { | |
// grab the identity | |
let identityPointer:AnyObject? = certEntry["identity"]; | |
let secIdentityRef:SecIdentityRef = identityPointer as! SecIdentityRef!; | |
print("\(identityPointer) :::: \(secIdentityRef)") | |
// grab the trust | |
let trustPointer:AnyObject? = certEntry["trust"]; | |
let trustRef:SecTrustRef = trustPointer as! SecTrustRef; | |
print("\(trustPointer) :::: \(trustRef)") | |
// grab the cert | |
let chainPointer:AnyObject? = certEntry["chain"]; | |
identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef, certArray: chainPointer!); | |
} | |
} | |
return identityAndTrust; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment