Swift 2 - Xcode 7.0 Cannot Access HTTPS site with unstrusted SSL Certificate

前端 未结 5 847
死守一世寂寞
死守一世寂寞 2021-02-06 01:00

Experts, I\'m a Beginner in IOS 9 / XCODE 7 / Swift 2 Development Kit

I\'m trying to create an ios app that simply route to Web Application in HTTPS protocol. Below is

5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-06 01:30

    Finally I fixed it

    Xcode will reject un-trusted self signed certificates from servers by default.

    we can override this Using NSURLConnection and can communicate with a self-signed server, since we have the ability to control the authentication through the additional delegate methods which are not available to a UIWebView. So using connection:didReceiveAuthenticationChallenge we can authenticate against the self signed server.

    References NSURLAuthenticationChallenge Docs , @Lilo Lu's Question

    I Resolved My Issue in below steps
    Step 1 : Defined a NSURLConnection in viewDidLoad() method of my viewController.swift as follows

     override func viewDidLoad() {
        super.viewDidLoad()
    
        let siteAddress = "https://domain:8443/path/to/page"
        let url = NSURL (string: siteAddress)
        let urlRequest = NSURLRequest(URL: url!)
        let urlConnection:NSURLConnection = NSURLConnection(request: request, delegate: self)!
        myWebView.loadRequest(urlRequest)
     }
    

    Step 2 : used NSURLConnection delegate methods

        func connection(connection: NSURLConnection, canAuthenticateAgainstProtectionSpace protectionSpace: NSURLProtectionSpace) -> Bool{
            print("canAuthenticateAgainstProtectionSpace method Returning True")
            return true
        }
    
    
        func connection(connection: NSURLConnection, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge){
    
            print("did autherntcationchallenge = \(challenge.protectionSpace.authenticationMethod)")
    
            if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust  {
                print("send credential Server Trust")
                let credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)
                challenge.sender!.useCredential(credential, forAuthenticationChallenge: challenge)
    
            }else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic{
                print("send credential HTTP Basic")
                let defaultCredentials: NSURLCredential = NSURLCredential(user: "username", password: "password", persistence:NSURLCredentialPersistence.ForSession)
                challenge.sender!.useCredential(defaultCredentials, forAuthenticationChallenge: challenge)
    
            }else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM{
                print("send credential NTLM")
    
            } else{
                challenge.sender!.performDefaultHandlingForAuthenticationChallenge!(challenge)
          }
    }
    

    and that worked !!

提交回复
热议问题