Ktor Multiplatform-Kotlin中的iOS的SSL固定 [英] Ktor multiplatform - SSL pinning for iOS in kotlin

查看:109
本文介绍了Ktor Multiplatform-Kotlin中的iOS的SSL固定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用下面的代码通过Ktor在Kotlin Multiplatform中进行SSL固定.

I am using below code for SSL pinning in Kotlin Multiplatform using Ktor.

我在此行代码上崩溃

val remoteCertificateData : NSData = SecCertificateCopyData(certificate) as NSData 

这是功能.

override fun URLSession(
            session: NSURLSession,
            didReceiveChallenge: NSURLAuthenticationChallenge,
            completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Unit
        ) {
            val serverTrust = didReceiveChallenge.protectionSpace.serverTrust

            val certificate = SecTrustGetCertificateAtIndex(serverTrust,0)

            var result: SecTrustResultType = 0u
            memScoped{
                val nativeResult = alloc<SecTrustResultTypeVar>()
                nativeResult.value = result
                SecTrustEvaluate(serverTrust!!, nativeResult.ptr)
            }

            val remoteCertificateData : NSData = SecCertificateCopyData(certificate) as NSData                                
            val bundle = NSBundle.bundleForClass(objc_getRequiredClass("IosClientEngine"))                

            val pathToCert = bundle.pathForResource("MyCertificate","cer")                

            val localCertificate : NSData = NSData.dataWithContentsOfFile(pathToCert!!)!!

            if (localCertificate == remoteCertificateData) {
                completionHandler(NSURLSessionAuthChallengeUseCredential,NSURLCredential.create(serverTrust))                    
            } else {
                completionHandler(NSURLSessionAuthChallengeUseCredential, null)                    
            }
        }

推荐答案

经过大量研究,我设法在Kotlin Multiplatform for iOS中转换了iOS代码.

After so many research I manage to convert iOS code in Kotlin Multiplatform for iOS.

override fun URLSession(
    session: NSURLSession,
    didReceiveChallenge: NSURLAuthenticationChallenge,
    completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Unit
) {
    val serverTrust = didReceiveChallenge.protectionSpace.serverTrust
    var result: SecTrustResultType = 0u

    memScoped{
        val nativeResult = alloc<SecTrustResultTypeVar>()
        nativeResult.value = result
        SecTrustEvaluate(serverTrust!!, nativeResult.ptr)
    }

    val serverCertificate = SecTrustGetCertificateAtIndex(serverTrust,0)
    val serverCertificateData = SecCertificateCopyData(serverCertificate)
    val data = CFDataGetBytePtr(serverCertificateData)
    val size = CFDataGetLength(serverCertificateData)

    val cert1 = NSData.dataWithBytes(data,size.toULong())
    val pathToCert = NSBundle.mainBundle.pathForResource("Your Certificate","cer")

    val localCertificate : NSData = NSData.dataWithContentsOfFile(pathToCert!!)!!

    if (localCertificate == cert1) {
        completionHandler(NSURLSessionAuthChallengeUseCredential,NSURLCredential.create(serverTrust))
    } else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, null)
    }
}

这篇关于Ktor Multiplatform-Kotlin中的iOS的SSL固定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆