当前位置: 首页 > 知识库问答 >
问题:

使用Swift和NSURLSession的iOS证书钉扎

支华池
2023-03-14

OWASP网站只包含Objective-C和NSURLConnection的示例。

共有1个答案

罗飞宇
2023-03-14

Swift 3+更新:

只需为nSurlSessionDelegate定义一个委托类,并实现didReceiveChallenge函数(此代码改编自objective-c OWASP示例):

class NSURLSessionPinningDelegate: NSObject, URLSessionDelegate {

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void) {

        // Adapted from OWASP https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#iOS

        if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
            if let serverTrust = challenge.protectionSpace.serverTrust {
                let isServerTrusted = SecTrustEvaluateWithError(serverTrust, nil)

                if(isServerTrusted) {
                    if let serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0) {
                        let serverCertificateData = SecCertificateCopyData(serverCertificate)
                        let data = CFDataGetBytePtr(serverCertificateData);
                        let size = CFDataGetLength(serverCertificateData);
                        let cert1 = NSData(bytes: data, length: size)
                        let file_der = Bundle.main.path(forResource: "certificateFile", ofType: "der")

                        if let file = file_der {
                            if let cert2 = NSData(contentsOfFile: file) {
                                if cert1.isEqual(to: cert2 as Data) {
                                    completionHandler(URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust:serverTrust))
                                    return
                                }
                            }
                        }
                    }
                }
            }
        }

        // Pinning failed
        completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge, nil)
    }

}

(你可以在这里找到Swift 2的要点--从最初的答案)

openssl s_client -connect my-https-website.com:443 -showcerts < /dev/null | openssl x509 -outform DER > my-https-website.der
if let url = NSURL(string: "https://my-https-website.com") {

    let session = URLSession(
            configuration: URLSessionConfiguration.ephemeral,
            delegate: NSURLSessionPinningDelegate(),
            delegateQueue: nil)


    let task = session.dataTask(with: url as URL, completionHandler: { (data, response, error) -> Void in
        if error != nil {
            print("error: \(error!.localizedDescription): \(error!)")
        } else if data != nil {
            if let str = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) {
                print("Received data:\n\(str)")
            } else {
                print("Unable to convert data to text")
            }
        }
    })

    task.resume()
} else {
    print("Unable to create NSURL")
}
 类似资料:
  • 问题内容: 如何在Swift中将证书固定到NSURLSession? 该OWASP网站只包含Objective- C和NSURLConnection的一个例子。 问题答案: Swift 3+ 更新: 只需定义一个委托类并实现didReceiveChallenge函数( 此代码改编自Objective-c OWASP示例 ): (您可以在此处找到Swift 2 的Gist- 从初始答案开始) 然后使

  • 目录 苹果开发帐号说明 苹果证书和X5打包服务器的配合使用 iOS证书申请教程 苹果证书和极光推送的配合使用   苹果开发帐号说明 个人账号(Individual)/公司团队账号 (Company/Organization): 费用都是99美金一年,两者无本质区别,都可以发布应用到苹果市场。 区别在于个人账号在App Store销售者只能显示个人的ID,比如san zhang,单人使用。公司团队账

  • 1.自我介绍 2面向对象介绍一下 3.面向过程介绍 4.面向过程的场景及缺点 5.线程池作用(说了句避免线程创建的开销) 6.线程创建开销很大吗,需要哪些开销?线程竞争如何解决 7.c++11新特性有哪些 8.lambda表达式的捕获方式及lambda的一个使用场景 9.实习的工作及简单问了点问题,没为难我 10.项目或者实习哪个的收获最大 11.makefile构建多个c++程序你会如何设计提示

  • 问题内容: 我有一个NSURLSession调用dataTaskWithRequest以这种方式发送POST请求 响应等于: 我的问题是我不知道如何获取名称为MYCOOKIEIS的“ Set-Cookie”中的cookie。 我将在用户登录时使用它,因此,如果用户未登录->登录(调用登录api),否则请转到主屏幕并调用其他API。 有人可以帮助我从那里拿走饼干吗? 问题答案: Swift呈现形式可

  • 整体时长不到1h,和IOS相关的基本没有,体会到被吊打是一种什么样的感觉,很多问题说的语无伦次,八成又凉了。 自我介绍一下 介绍一下手写模板库这个项目 你实现的STL和标准模板库有什么不同 介绍一下集群聊天服务器这个项目 你提到了git,创建仓库到推送需要哪些命令? 提交和推送有什么不一样? 合并分支时发生冲突怎么办? 在学校学过什么专业课 介绍一下面向对象 为什么要有面向对象这个概念呢 面向对象

  • 问题内容: 在集成到更大的应用程序之前,我正在尝试测试一个概念验证的命令行应用程序。我想要做的是使用此示例使用NSURLSession下载一些数据。但是,如果使用简单的OS X命令行应用程序中给出的示例,则该应用程序将在检索数据之前退出。 如何使用NSURLSession从独立的命令行应用程序下载数据?我所读的内容是使用NSRunLoop,但是我还没有在Swift中找到明确的示例,因此,如果NSR