0
votes

I am facing an issue while uploading image in Amazon AWS. Here is my code:

import UIKit

protocol ContentUploaderDelegate {

    func onContentLoadComplete(status:Bool,serverResponse:String)
}


class ContentUploader
{
    let contentURL = "https:<MY URL>amazonaws.com/api/v1/contents"
    var delegate:ContentUploaderDelegate?


    func uploadImage(image:UIImage,xAuth:String,mimeType:String,imageName:String)
    {
        let url = NSURL(string: contentURL)

        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "POST"

        let boundary = generateBoundaryString()

        //define the multipart request type
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        request.setValue(xAuth, forHTTPHeaderField: "x-auth-token")
        request.setValue("application/json", forHTTPHeaderField: "accept")

        let image_data = UIImageJPEGRepresentation(image, 1.0)

        if(image_data == nil)
        {
            return
        }

        let body = NSMutableData()

        //name to save in server
        let fname = imageName
        let mimetype = mimeType

        //define the data post parameter
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition:form-data; name=\"test\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("hi\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition:form-data; name=\"files\"; filename=\"\(fname)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(image_data!)
        body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        //set the HTTPBody
        request.HTTPBody = body

        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithRequest(request) {
            (
            let data, let response, let error) in

            guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
                print("error")
                self.delegate?.onContentLoadComplete(false, serverResponse: (error?.description)!)
                return
            }

            let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("success \(dataString)")
            self.delegate?.onContentLoadComplete(true, serverResponse:dataString! as String)
        }

        task.resume()
    }

    private func generateBoundaryString() -> String
    {
        return "Boundary-\(NSUUID().UUIDString)"
    }

The following delegate method never gets called. What could be the reason?

    func URLSession(session: NSURLSession,
                    task: NSURLSessionTask,
                    didReceiveChallenge challenge: NSURLAuthenticationChallenge,
                                        completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?)
        -> Void) {

        let protectionSpace = challenge.protectionSpace

        let theSender = challenge.sender

        if protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
            if (challenge.protectionSpace.host == "ec2-52-36-216-81.us-west-2.compute.amazonaws.com") {
                if let theTrust = protectionSpace.serverTrust{

                    let theCredential = NSURLCredential(trust: theTrust)

                    theSender!.useCredential(theCredential, forAuthenticationChallenge: challenge)

                    return
                }
            }
        }
        theSender!.performDefaultHandlingForAuthenticationChallenge!(challenge)

        return
    }
}

And I am getting the following error. Any idea why getting this error?

Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “.amazonaws.com” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, NSErrorPeerCertificateChainKey={type = immutable, count = 1, values = ( 0 : .com i: www..com> )}, NSUnderlyingError=0x7f9d42aedc10 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9813, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, kCFStreamPropertySSLPeerCertificates={type = immutable, count = 1, values = ( 0 : .com i: www..com> )}}}, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “.amazonaws.com” which could put your confidential information at risk., NSErrorFailingURLKey=https://amazonaws.com/api/v1/contents, NSErrorFailingURLStringKey=https://.amazonaws.com/api/v1/contents, NSErrorClientCertificateStateKey=0}

1

1 Answers

0
votes
Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “.amazonaws.com”

I believe something is wrong with the common name “.amazonaws.com”

NSErrorFailingURLKey=https://amazonaws.com/api/v1/contents,
NSErrorFailingURLStringKey=https://.amazonaws.com/api/v1/contents

The URLs shown in the error message do not appear to be a well know endpoint. I would expect to see something like https://ec2-2-2-2-2.compute-1.amazonaws.com or another Fully Qualified Domain name there.

The error message also confirms this. You are connecting a host, but the name on the certificate does not match. This is the reason for the pretending to be “.amazonaws.com” error.

Confirm the correct endpoint, and how your code is forming the full URL.

The following delegate method never gets called. What could be the reason?

The error occurs before the function is called. The session is never established because of the certificate error.