gpt4 book ai didi

ios - 信任用于 HTTPS 连接的自签名证书

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:08:01 27 4
gpt4 key购买 nike

我正在使用与服务器连接的 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 使用的格式。

最佳答案

要使这项工作正常进行,您需要用 NSURLCredential 响应 URLSession(_:didReceiveChallenge:completionHandler:) 委托(delegate)调用。

基本步骤是:

  1. 将您的 bundle 中的证书加载到 CFDataRef 中。
  2. NSURLCredential 所需的证书中提取身份。
  3. 使用提取的身份和 SecIdentityCopyCertificate 创建一个 SecCertificateRef
  4. 使用 init(identity:certificates:persistence:)
  5. 创建 NSURLCredential

此示例展示了如何提取从 bundle 中加载的证书的身份和信任:

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 而不是 NSURLConnection 因为每个版本都有越来越多的方法被弃用。

您可以找到一些如何处理证书和信任的示例 here .

关于ios - 信任用于 HTTPS 连接的自签名证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28071563/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com