iOS:SocketRocket - 如何实现SSL握手

时间:2014-10-21 15:59:59

标签: ios ssl nsurlconnection socketrocket

刚刚与Protobufs一起切换到Websockets。就像IOS上的魅力一样,但我不确定如何通过SocketRocket Lib实现SSL握手(如NSURLConnection)。是否有人有过这方面的经验,或者它是否尚未得到支持。

TSL连接已经正常工作,SSL固定也可以工作 - 但是如何通过SocketRocket通过Web套接字正确验证SSL链来实现正确的SSL握手?!

BR

1 个答案:

答案 0 :(得分:4)

编辑:纠正我之前回答中的错误。

CFStream是Socket Rocket在后台使用的,它将自动处理握手,假设证书已添加到钥匙串中。如果您需要添加证书,请参阅此问题的答案:iOS: Pre install SSL certificate in keychain - programmatically

但是,如果Pinning是您正在寻找的东西,这对Socket Rocket来说很简单。使用initWithURLRequest初始化程序,其他所有内容都会自动处理。对于固定证书,SocketRocket不会验证您想要的行为的证书链,因为通过固定,您特别要求信任此证书或仅由此证书签名的证书。即它不依赖于验证链。

    NSURL *url = [NSURL URLWithString: ServerSocketURLString];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"certificatefilename" ofType:@"cer"];
    NSData *certData = [[NSData alloc] initWithContentsOfFile:cerPath];
    CFDataRef certDataRef = (__bridge CFDataRef)certData;
    SecCertificateRef certRef = SecCertificateCreateWithData(NULL, certDataRef);
    id certificate = (__bridge id)certRef;

    [request setSR_SSLPinnedCertificates:@[certificate]];

    self.clientWebSocket = [[SRWebSocket alloc] initWithURLRequest:request];

    self.clientWebSocket.delegate = self;