2015-01-21 7 views
1

서버와 연결되는 Swift를 사용하여 iOS 응용 프로그램을 만들고 있습니다. HTTPS 연결을위한 자체 서명 된 인증서 신뢰

public class SendImages: NSObject,NSURLConnectionDelegate { 

    var user = UserInfo?() 
    var url = String?() 
    var urladditional = String?() 
    var sendImages: NSURLConnection = NSURLConnection() 
    var my_data:NSMutableData? = nil 
    var statusCode: NSInteger? = nil 
    public var delegate = SendImagesInterface?() 

    init(url: String) {  
     self.url = url 
    } 

    public func send(images_to_data: NSMutableArray ,user: UserInfo) { 

     var error : NSError? 
     var data_to_send : NSData = NSJSONSerialization.dataWithJSONObject(jsontoSend, 
      options: NSJSONWritingOptions(0), error: &error)! 

     var completeURL: AnyObject? = AnyObject?() 
     completeURL = NSURL(string: (self.url)!+(self.urladditional)!) 

     let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData 
     var request = NSMutableURLRequest(URL: completeURL as NSURL, cachePolicy: cachePolicy, timeoutInterval: 30.0) 
     request.HTTPMethod = "POST" 
     request.HTTPBody = data_to_send 

     sendImages = NSURLConnection(request: request, delegate: self)! 
     self.my_data = NSMutableData() 
    } 

    func connection(connection: NSURLConnection!, didFailWithError error: NSError!) { 
     println("Error to connect with URL") 
     self.my_data = nil 
    } 

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { 
     println("Receiving data") 
     self.my_data!.appendData(data) 
    } 

    func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {    
     println("Receiving response headers") 
     var httpResponse = response as NSHTTPURLResponse 
     statusCode = httpResponse.statusCode 
    } 

    func connectionDidFinishLoading(connection: NSURLConnection!){ 
     println("Conexion finished") 
    } 
} 

지금 추가 보안을 위해 내가 HTTPS 연결을 사용하려면 : 이것은 내가 이미지를 업로드하는 데 사용하는 코드입니다. 이것을 어떻게 할 수 있습니까? 나는형식의 인증서를 가지고 있는데, iOS가 사용하는 것으로 생각합니다.

답변

1

이 작업을 수행하려면 URLSession(_:didReceiveChallenge:completionHandler:) 대리인에게 NSURLCredential으로 응답해야합니다.

기본 단계는 다음과 같습니다

  1. 로드합니다 CFDataRef에 번들에서 인증서.
  2. NSURLCredential에 필요한 인증서에서 신원을 추출하십시오.
  3. 추출한 ID를 SecIdentityCopyCertificate과 함께 사용하여 SecCertificateRef을 만듭니다.
  4. 가 작성 NSURLCredential이 예는 번들에서로드 인증서의 정체성과 신뢰를 추출하는 방법을 보여줍니다

init(identity:certificates:persistence:)과 :

struct IdentityAndTrust {   
    var identity:SecIdentityRef 
    var trust:SecTrustRef 
} 

func extractIdentity(certData:NSData, certPassword:String) -> IdentityAndTrust { 

    var identityAndTrust:IdentityAndTrust! 
    var securityError:OSStatus = errSecSuccess; 

    var items:Unmanaged<CFArray>? 
    var certOptions:CFDictionary = [ kSecImportExportPassphrase.takeRetainedValue() as String: certPassword ]; 
    securityError = SecPKCS12Import(certData, certOptions, &items); 

    if securityError == 0 { 

     let certItems:CFArray = items?.takeUnretainedValue() as CFArray!; 
     let certItemsArray:Array = certItems as Array 
     let dict:AnyObject? = certItemsArray.first; 

     if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> { 
      let identityPointer:AnyObject? = certEntry["identity"]; 
      let secIdentityRef:SecIdentityRef = identityPointer as SecIdentityRef!; 

      let trustPointer:AnyObject? = certEntry["trust"]; 
      let trustRef:SecTrustRef = trustPointer as SecTrustRef; 

      identityAndTrust = IdentityAndTrust(identity: secIdentityRef, trust: trustRef); 
     } 
    } 

    return identityAndTrust; 
} 

는 당신이 가지고 몇 가지가 있습니다를 명심하십시오. 가장 중요한 인증서는 만료 될 수 있습니다. 한 시점에서 인증서를 변경해야하므로 처음부터 그 결과에 대비할 수 있습니다. 게다가 모든 릴리스에서 점점 더 많은 메소드가 사용되지 않기 때문에 NSURLConnection을 초과하여 NSURLSession을 선호해야합니다.

인증서를 처리하고 here을 신뢰하는 방법에 대한 몇 가지 예를 찾을 수 있습니다.