使用Objective-C以编程方式记录客户端和服务器之间的TLS/SSL握手

Ces*_*reu 5 objective-c cfnetwork ios ios6

我希望能够以编程方式查看TLS握手信息,并能够执行以下操作:

NSLog(@"Client Hello");
//...
NSLog(@"Server Hello");
Run Code Online (Sandbox Code Playgroud)

有一篇很好的博客文章更详细地显示了握手信息(或参见下面的wireshark捕获图片).

我已经在使用ASIHTTPRequest,因此下面的代码示例来自该代码库.但是,如果可以使用它来记录TLS握手信息,我会认真考虑切换到更现代的AFNetworking库.我相信AFNetworking使用不同的对象(即NSURLConnection,NSURLCredential).

我正在向流添加SecIdentityRef(查看更多代码上下文).

CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties);
Run Code Online (Sandbox Code Playgroud)

我列出了以下网络事件:

static const CFOptionFlags kNetworkEvents = kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventHasBytesAvailable | kCFStreamEventEndEncountered | kCFStreamEventErrorOccurred;
Run Code Online (Sandbox Code Playgroud)

此事件在文档的CFStream部分中描述.

这是流的打开方式(查看更多代码上下文):

CFStreamClientContext ctxt = {0, self, NULL, NULL, NULL};
if (CFReadStreamSetClient((CFReadStreamRef)[self readStream], kNetworkEvents, ReadStreamClientCallBack, &ctxt)) {
    if (CFReadStreamOpen((CFReadStreamRef)[self readStream])) {
        streamSuccessfullyOpened = YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

调用callback(ReadStreamClientCallBack)来处理事件时使用switch语句:

switch (type) {
    case kCFStreamEventHasBytesAvailable:
        //...
        break;

    case kCFStreamEventEndEncountered:
        //...
        break;

    //other events here...

    default:
        break;
}
Run Code Online (Sandbox Code Playgroud)

我相信握手发生在:kCFStreamEventOpenCompletedkCFStreamEventHasBytesAvailable.

按照这里的说明,我能够使用Wireshark捕获和分析来自/到iPhone和服务器的数据包.

Wireshark捕获图片

有没有我可以调用的API或我可以使用的库来获取设备上的类似信息?