因为我们正在使用WebSocket,所以在iOS客户端中,我们使用SocketRocket(Objective-C WebSocket客户端库)来实现WebSocket通信.
问题是我不知道如何将我的客户端SSL证书发送到服务器.
我可以设置CFStream的属性,如kcfStreamPropertySocketSecurityLevel.但我不知道它是如何工作的.我在CFStream中找不到任何关于证书的文档.
我知道当我们需要连接到httpS服务器时,我们可以在NSURLConnection中使用dIDReceiveAuthenticationChallenge.但据我所知,CFStream中没有对应物.
有人有什么想法吗?
解决方法 经过大量的学习和尝试,我现在可以自己回答.也希望它对你有用.实际上,我需要的是使用CFStream实现客户端SSL身份验证.所以我需要这样做:
>将PKCS#12文件放入我的应用程序包中
>将此文件作为NSData读取到pkcsData
>使用方法SecPKCS12import导入pkcsData
>从上面导入的数据中获取身份和证书,并生成证书数组
>将数组设置为CFCFriteStreamRef的kcfStreamPropertySSLSettings中的键kcfStreamSSLCertificates
示例代码如下:
// Read .p12 file Nsstring *path = [[NSBundle mainBundle] pathForResource:@"clIEnt" ofType:@"p12"]; NSData *pkcs12data = [[NSData alloc] initWithContentsOffile:path]; // import .p12 data CFArrayRef keyref = NulL; Osstatus sanityChesk = SecPKCS12import((__brIDge CFDataRef)pkcs12data,(__brIDge CFDictionaryRef)[NSDictionary dictionaryWithObject:@"123456" forKey:(__brIDge ID)kSecimportExportPassphrase],&keyref); if (sanityChesk != noErr) { NSLog(@"Error while importing pkcs12 [%ld]",sanityChesk); } else NSLog(@"Success opening p12 certificate."); // IDentity CFDictionaryRef IDentityDict = CFArrayGetValueAtIndex(keyref,0); SecIDentityRef IDentityRef = (SecIDentityRef)CFDictionaryGetValue(IDentityDict,kSecimportItemIDentity); // Cert SecCertificateRef cert = NulL; Osstatus status = SecIDentitycopyCertificate(IDentityRef,&cert); if (status) NSLog(@"SecIDentitycopyCertificate Failed."); // the certificates array,containing the IDentity then the root certificate NSArray *myCerts = [[NSArray alloc] initWithObjects:(__brIDge ID)IDentityRef,(__brIDge ID)cert,nil]; // [SSLOptions setobject:[NSNumber numberWithBool:YES] forKey:(Nsstring *)kcfStreamSSLAllowsExpiredRoots]; [SSLOptions setobject:[NSNumber numberWithBool:YES] forKey:(Nsstring *)kcfStreamSSLAllowsExpiredCertificates]; [SSLOptions setobject:[NSNumber numberWithBool:YES] forKey:(Nsstring *)kcfStreamSSLAllowsAnyRoot]; [SSLOptions setobject:[NSNumber numberWithBool:NO] forKey:(Nsstring *)kcfStreamSSLValIDatesCertificateChain]; [SSLOptions setobject:@"test.domain.com:443" forKey:(Nsstring *)kcfStreamSSLPeername]; [SSLOptions setobject:(Nsstring *)kcfStreamSocketSecurityLevelNegotiatedSSL forKey:(Nsstring*)kcfStreamSsllevel]; [SSLOptions setobject:(Nsstring *)kcfStreamSocketSecurityLevelNegotiatedSSL forKey:(Nsstring*)kcfStreamPropertySocketSecurityLevel]; [SSLOptions setobject:myCerts forKey:(Nsstring *)kcfStreamSSLCertificates]; [SSLOptions setobject:[NSNumber numberWithBool:NO] forKey:(Nsstring *)kcfStreamSSlisServer]; [_outputStream setProperty:SSLOptions forKey:(__brIDge ID)kcfStreamPropertySSLSettings];
因为我使用SocketRocket,所以我在自己的fork中添加了这些代码:https://github.com/nickcheng/SocketRocket
总结以上是内存溢出为你收集整理的如何在我的iOS应用程序中使用CFStream将客户端SSL证书发送到服务器?全部内容,希望文章能够帮你解决如何在我的iOS应用程序中使用CFStream将客户端SSL证书发送到服务器?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)