从 "SecTrustCopyPublicKey" 调用中收到的值的含义

Meaning of values received from "SecTrustCopyPublicKey" call

向 google.com 发出 HTTPS 请求时,我执行了以下操作:

import Foundation

class LearnNSURLSession: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate {
    override init() {
        super.init()
        let mySession = NSURLSession(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(), delegate: self, delegateQueue: NSOperationQueue.mainQueue())
        let data = mySession.dataTaskWithURL(NSURL(string: "https://www.google.com")!, completionHandler: myHandler)
        data.resume()
    }

    func myHandler(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void {
        let s = NSString(data: data, encoding: NSASCIIStringEncoding)
        println(s)
    }

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
        println("ERROR:  \(error)")
    }

    // Handles HTTPS connections
    func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void) {
        println("\nPublic KEY:  \(SecTrustCopyPublicKey(challenge.protectionSpace.serverTrust).takeUnretainedValue())")
        completionHandler(NSURLSessionAuthChallengeDisposition.PerformDefaultHandling, nil)
    }

    // Handles redirection
    func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse, newRequest request: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) {
        completionHandler(request)
    }

当我 运行 代码时,我注意到 URLSession:didReceiveChallenge 被调用了两次,我从 println("Public KEY:\(SecTrustCopyPublicKey(challenge.protectionSpace.serverTrust).takeUnretainedValue())") 得到以下输出:

Public KEY:  <SecKeyRef algorithm id: 1, key type: RSAPublicKey, version: 3, block size: 2048 bits, exponent: {hex: 10001, decimal: 65537}, modulus: 982A37418AF3B46A9C0BDC42520DD4EFE3854B118194B8A199ACE499B8B3FF8F566360E0DCF44659AA2BB07CCAD187FB9238C925B2F1F7864492BF79F99DE9DD8F8CFB6D868C5DCA4146D78BA33182FC4FE54D9C68B14F3D13795FAAA20A5133B73D1FEBD1AD1B12B2010A8687D6848335A1C0BA4FCBF530A098EE16C22EEBE21D5DD8C296ECA39501B3D1A8848DEC265B9A1F63D95C852040B40A5B2E7712D8A24CAC67245D9AD3A8D9446E26905A4D8A2002876659BFE9204D30A08CBC49095FF3045C33E52C20FD6EA6FD5DD7E9F61E103190BE46638C0FBD43CCE88242020395921C7542F59D17E63BEB17C95798E45DEB989610B672294A856BF1F6667B, addr: 0x7f96fb044000>

Public KEY:  <SecKeyRef curve type: kSecECCurveSecp256r1, algorithm id: 3, key type: ECPublicKey, version: 3, block size: 256 bits, y: Value1, x: Value2, addr: 0x7f96fc032970>

我在第二个输出中省略了 "y" 和 "x" 的值,因为我不知道我是否应该 post 它们。 "Value1" (y) 是一个包含 66 个字符的字符串,"Value2" (x) 是一个包含 130 个字符的字符串。两者都只有数字和大写字母,没有符号。

第二个输出中的 "x" 和 "y" 值是多少?他们是"subjectPublicKeyInfo"吗?为什么这个函数被调用了两次?为什么我必须在调用 "SecTrustCopyPublicKey" 之前调用 "SecTrustEvaluate"?文档说我必须这样做,但我找不到原因。此外,当建立 HTTPS 连接时,iOS 会自动执行 "SecTrustEvaluate" 的操作吗?

What are the "x" and "y" values in the second output?

正在使用的椭圆曲线的参数。基本上,"the public key." 出于您的目的,您不需要知道数学,但接受有两个非常大的数字,当将它们放入数学曲线的公式中时,可以用来加密只有发送者才能访问的数据可以解密或对称地验证数据是由给定的发送者发送的。如果您关心,here's 对这个概念的相当有用的介绍。没有一些数学很难解释,但那篇论文中的数学并不太疯狂。

"numbers and letters"就是两个大数的十六进制编码。它与您列出的另一个键中的 "modulus" 相同。这是一种不同的算法,称为 RSA。在那种情况下,这是一个(非常大的)数字,将在其中一个步骤中用作模数(您除以并取余数的数字)。

所有这些数字都是public。这里没有秘密。

Why is this function called twice?

它开始协商 RSA。然后看起来它升级为椭圆曲线,对于密钥中给定的位数,椭圆曲线通常更强。简答:"protocol upgrade."

And why I must call "SecTrustEvaluate" before calling "SecTrustCopyPublicKey"?

SecTrustEvaluate 在 public 密钥在数据结构中可用之前进行了一系列必要的解码。 "Because Security.Framework is implemented that way." 理论上,SecTrustCopyPublicKey 可以根据需要进行解码,但事实并非如此。

Also, does iOS automatically do what "SecTrustEvaluate" does, when a HTTPS connection is being established?

是的。