Ktor Multiplatform-Kotlin中的iOS的SSL固定 [英] Ktor multiplatform - SSL pinning for iOS in kotlin
本文介绍了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屋!
查看全文