Navas Basheer Navas Basheer - 1 year ago 89
iOS Question

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

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 my code so far in


import UIKit

class ViewController: UIViewController {

@IBOutlet var myWebView: UIWebView!

* Function to Display the Web Application initial URL
func loadAppURL(){
let siteAddress = "https://domain:8443/path/to/page"
let url = NSURL (string: siteAddress)
let urlRequest = NSURLRequest(URL: url!)

override func viewDidLoad() {

override func didReceiveMemoryWarning() {
// Dispose of any resources that can be recreated.

While Building my App it shows the below Error Message

2015-10-01 01:05:13.879 Web Page Tester[2947:31838]
NSURLSession/NSURLConnection HTTP load failed
(kCFStreamErrorDomainSSL, -9807)

and if i try building my app instead of "https://domain:8443/path/to/page" with "" its works fine.

I can access my web application in Safari and it asks for accepting the security risks. and i accept it and i can access my Application.

Guide me to fix my issues, Thanks in advance.

Answer Source

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() {

    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)!

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{

and that worked !!