12345 | < key >NSAPPTransportSecurity</ key > < dict > < key >NSAllowsArbitraryLoads</ key > < true /> </ dict > |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | import UIKit import Alamofire class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //認證相關設置 let manager = SessionManager . default manager.delegate.sessionDidReceiveChallenge = { session, challenge in //認證服務器證書 if challenge.PRotectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { print ( "服務端證書認證!" ) let serverTrust: SecTrust = challenge.protectionSpace.serverTrust! let certificate = SecTrustGetCertificateAtIndex (serverTrust, 0)! let remoteCertificateData = CFBridgingRetain ( SecCertificateCopyData (certificate))! let cerPath = Bundle .main.path(forResource: "tomcat" , ofType: "cer" )! let cerUrl = URL (fileURLWithPath:cerPath) let localCertificateData = try! Data (contentsOf: cerUrl) if (remoteCertificateData.isEqual(localCertificateData) == true ) { let credential = URLCredential (trust: serverTrust) challenge.sender?.use(credential, for : challenge) return ( URLSession . AuthChallengeDisposition .useCredential, URLCredential (trust: challenge.protectionSpace.serverTrust!)) } else { return (.cancelAuthenticationChallenge, nil ) } } //認證客戶端證書 else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate { print ( "客戶端證書認證!" ) //獲取客戶端證書相關信息 let identityAndTrust: IdentityAndTrust = self .extractIdentity(); let urlCredential: URLCredential = URLCredential ( identity: identityAndTrust.identityRef, certificates: identityAndTrust.certArray as ? [ AnyObject ], persistence: URLCredential . Persistence .forSession); return (.useCredential, urlCredential); } // 其它情況(不接受認證) else { print ( "其它情況(不接受認證)" ) return (.cancelAuthenticationChallenge, nil ) } } //數據請求 Alamofire .request( "https://192.168.1.112:8443" ) .responseString { response in print (response) } } //獲取客戶端證書相關信息 func extractIdentity() -> IdentityAndTrust { var identityAndTrust: IdentityAndTrust ! var securityError: OSStatus = errSecSuccess let path: String = Bundle .main.path(forResource: "mykey" , ofType: "p12" )! let PKCS12Data = NSData (contentsOfFile:path)! let key : NSString = kSecImportExportPassphrase as NSString let options : NSDictionary = [key : "123456" ] //客戶端證書密碼 //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: SecIdentity = identityPointer as ! SecIdentity ! print ( "/(identityPointer) :::: /(secIdentityRef)" ) // grab the trust let trustPointer: AnyObject ? = certEntry[ "trust" ] let trustRef: SecTrust = trustPointer as ! SecTrust print ( "/(trustPointer) :::: /(trustRef)" ) // grab the cert let chainPointer: AnyObject ? = certEntry[ "chain" ] identityAndTrust = IdentityAndTrust (identityRef: secIdentityRef, trust: trustRef, certArray: chainPointer!) } } return identityAndTrust; } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } //定義一個結構體,存儲認證相關信息 struct IdentityAndTrust { var identityRef: SecIdentity var trust: SecTrust var certArray: AnyObject } |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | import UIKit import Alamofire class ViewController : UIViewController { //自簽名網站地址 let selfSignedHosts = [ "192.168.1.112" , "www.hangge.com" ] override func viewDidLoad() { super .viewDidLoad() //認證相關設置 let manager = SessionManager . default manager.delegate.sessionDidReceiveChallenge = { session, challenge in //認證服務器(這里不使用服務器證書認證,只需地址是我們定義的幾個地址即可信任) if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust && self .selfSignedHosts.contains(challenge.protectionSpace.host) { print ( "服務器認證!" ) let credential = URLCredential (trust: challenge.protectionSpace.serverTrust!) return (.useCredential, credential) } //認證客戶端證書 else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate { print ( "客戶端證書認證!" ) //獲取客戶端證書相關信息 let identityAndTrust: IdentityAndTrust = self .extractIdentity(); let urlCredential: URLCredential = URLCredential ( identity: identityAndTrust.identityRef, certificates: identityAndTrust.certArray as ? [ AnyObject ], persistence: URLCredential . Persistence .forSession); return (.useCredential, urlCredential); } // 其它情況(不接受認證) else { print ( "其它情況(不接受認證)" ) return (.cancelAuthenticationChallenge, nil ) } } //數據請求 Alamofire .request( "https://192.168.1.112:8443" ) .responseString { response in print (response) } } //獲取客戶端證書相關信息 func extractIdentity() -> IdentityAndTrust { var identityAndTrust: IdentityAndTrust ! var securityError: OSStatus = errSecSuccess let path: String = Bundle .main.path(forResource: "mykey" , ofType: "p12" )! let PKCS12Data = NSData (contentsOfFile:path)! let key : NSString = kSecImportExportPassphrase as NSString let options : NSDictionary = [key : "123456" ] //客戶端證書密碼 //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: SecIdentity = identityPointer as ! SecIdentity ! print ( "/(identityPointer) :::: /(secIdentityRef)" ) // grab the trust let trustPointer: AnyObject ? = certEntry[ "trust" ] let trustRef: SecTrust = trustPointer as ! SecTrust print ( "/(trustPointer) :::: /(trustRef)" ) // grab the cert let chainPointer: AnyObject ? = certEntry[ "chain" ] identityAndTrust = IdentityAndTrust (identityRef: secIdentityRef, trust: trustRef, certArray: chainPointer!) } } return identityAndTrust; } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } //定義一個結構體,存儲認證相關信息 struct IdentityAndTrust { var identityRef: SecIdentity var trust: SecTrust var certArray: AnyObject } |
新聞熱點
疑難解答