首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带SSL的GCDAsyncSocket

带SSL的GCDAsyncSocket
EN

Stack Overflow用户
提问于 2013-08-20 06:36:13
回答 1查看 5K关注 0票数 3

我运行一个Java服务器,它接受套接字或SSLSocket连接(不同的端口)。在客户端,我在iPhone应用程序中使用GCDAsyncSocket连接到服务器。如果我使用不安全的版本(不使用SSL),它可以正常工作。

现在,我尝试使用SSL进行连接。怎么做?我完全不知道从哪里开始。我的问题:

1)我需要什么样的证书?使用.bks证书的Android应用程序在同一台服务器上运行良好。

2)如何将证书导入应用程序?我希望它稍后通过AppStore发布。我必须将证书文件放在应用程序的某个目录中吗?

3)在哪里加载代码中的证书?是否有类似于-(LoadCertificate){ NSString *my证书=@“client.bks”的方法;.}

4)我必须设置哪些参数来激活GCDAsyncSocket中的SSL,比如BOOL useSSL = true;

5)假设问题1-4得到回答。现在怎么办?如何启动到服务器的连接?使用哪些参数的构造函数?

如果有人问“为什么要使用SSLSocket而不是.”。因为服务器已经在那里了,而且它在Android应用程序中也是这样工作的。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2013-09-24 06:28:04

这是个老生常谈的问题,但我希望它能帮助到别人。

  1. 我更喜欢pfx,但我认为bks也会好的。
  2. 是的,你得把证书装起来。
  3. 您需要在didConnectToHost方法中设置SSL设置。
  4. sock startTLS:sslSettings;

最后,在CocoaAsyncSocket文件夹中有一个名为ConnectTest的示例应用程序,您应该首先检查

代码语言:javascript
复制
NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init];
        NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"bks"]];
        CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(pkcs12data);
        CFStringRef password = CFSTR("YOUR PASSWORD");
        const void *keys[] = { kSecImportExportPassphrase };
        const void *values[] = { password };
        CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

        CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

        OSStatus securityError = SecPKCS12Import(inPKCS12Data, options, &items);
        CFRelease(options);
        CFRelease(password);

        if(securityError == errSecSuccess)
            NSLog(@"Success opening p12 certificate.");

        CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
        SecIdentityRef myIdent = (SecIdentityRef)CFDictionaryGetValue(identityDict,
                                                                      kSecImportItemIdentity);

        SecIdentityRef  certArray[1] = { myIdent };
        CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);

        [sslSettings setObject:(id)CFBridgingRelease(myCerts) forKey:(NSString *)kCFStreamSSLCertificates];
        [sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel];
        [sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
        [sslSettings setObject:@"CONNECTION ADDRESS" forKey:(NSString *)kCFStreamSSLPeerName];
        [sock startTLS:sslSettings];
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18328465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档