信任HTTPS连接的自签名证书

时间:2015-01-21 15:59:06

标签: ios http swift https

我正在使用Swift创建一个iOS应用程序,它与服务器连接。这是我用来上传图片的代码:

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连接。我怎样才能做到这一点?我有.der格式的证书,我认为这是iOS使用的。

1 个答案:

答案 0 :(得分:1)

要完成这项工作,您需要做的是通过$(".hamburger-menu").click(function(){ $(".two").toggleClass("two-rotate-back two-rotate"); $(".three").toggleClass("three-rotate-back three-rotate"); }); 代理人电话NSURLCredential回复。

基本步骤是:

  1. 将捆绑包中的证书加载到URLSession(_:didReceiveChallenge:completionHandler:)
  2. CFDataRef所需的证书中提取身份。
  3. 将提取的身份与NSURLCredential一起使用,以创建SecIdentityCopyCertificate
  4. 使用SecCertificateRef
  5. 创建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; } 而不是NSURLSession,因为每个版本都会弃用越来越多的方法。

    您可以找到一些如何处理证书并信任here的例子。