如何在我的iOS应用程序中使用CFStream将客户端SSL证书发送到服务器?

如何在我的iOS应用程序中使用CFStream将客户端SSL证书发送到服务器?,第1张

概述我们有一个处理SSL的WebSocket安全服务器.我们希望在我们的iOS客户端中放置客户端SSL证书,以确保与服务器通信时的安全性. 因为我们正在使用WebSocket,所以在iOS客户端中,我们使用SocketRocket(Objective-C WebSocket客户端库)来实现WebSocket通信. 问题是我不知道如何将我的客户端SSL证书发送到服务器. 我可以设置CFStream的属性 我们有一个处理SSL的WebSocket安全服务器.我们希望在我们的iOS客户端中放置客户端SSL证书,以确保与服务器通信时的安全性.

因为我们正在使用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证书发送到服务器?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1114190.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存