iOS:使用GCDAsyncSocket为相互SSL身份验证创建服务器套接字

时间:2014-10-27 16:37:24

标签: ios ssl gcdasyncsocket

我把头发拉出来,非常感谢一些帮助。不幸的是,我对SSL的体验非常有限,所以我不知道自己哪里出错了。

我需要开发一个iOS应用程序,它充当与客户端进行相互SSL身份验证的服务器。我使用GCDAsyncSocket库并且我设法使服务器部分正常工作(没有SSL),但是,我仍然无法使SSL工作。我已经看过这个post了,但是,它并没有解释为实现我想要的目标而需要执行的步骤。

在证书设置方面,我有以下p12证书:

  • 自签名服务器根CA证书
  • 上述CA颁发的服务器证书(ServerCert)。
  • 自签名客户端根CA证书
  • 上述CA颁发的客户证书(ClientCert)。

然后我在iOS设备上安装了两个根CA证书,并在我的应用程序中捆绑了serverCert证书。当接受新套接字时,我从p12文件中提取证书信息(根据apple certificate programming guide),并在开始SSL会话之前按如下方式设置SSL设置:

-(NSDictionary*) loadSSLSettings
{
    // Configure SSL/TLS settings
    NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:4];

    // Configure this connection as the server
    [settings setObject:[NSNumber numberWithBool:YES]
                 forKey:(NSString *)kCFStreamSSLIsServer];

    CFArrayRef certsArray = [self loadCertificates];

    [settings setObject:(id)CFBridgingRelease(certsArray) forKey:(NSString *)kCFStreamSSLCertificates];
    [settings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel];
    [settings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
    return settings;
}

-(CFArrayRef) loadCertificates
{
    // Load Certificate
    NSString *path = [[NSBundle mainBundle] pathForResource:@"ServerCert" ofType:@"p12"];
    NSData *p12data = [NSData dataWithContentsOfFile:path];
    CFDataRef inP12data = (__bridge CFDataRef)p12data;

    SecIdentityRef myIdentity;
    SecTrustRef myTrust;
    extractIdentityAndTrust(inP12data, &myIdentity, &myTrust);

    SecCertificateRef myCertificate;
    SecIdentityCopyCertificate(myIdentity, &myCertificate);

    const void *certs[] = { myCertificate };
    CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL);

    return certsArray;
}

此代码似乎可以正常加载证书,但是当我使用openSSL建立客户端连接(这甚至没有尝试相互SSL)时,例如:

openssl s_client -connect 192.168.2.8:1700 -state -debug

我得到以下输出:

> SSL_connect:before/connect initialization
> SSL_connect:SSLv2/v3 write client hello A 
> SSL_connect:error in SSLv2/v3 read server hello A

iOS日志通过GCDAsyncSocket库生成:

  

CFStreamSetProperty中的错误,代码:8

我所能说的只是代码8是'其他'

我不知道出了什么问题......也许我做了一些根本错误的事情,如果是这样的话,我非常感谢有人指出:)

此外,一旦我完成了这一步,我如何在发送客户端证书时验证它?

如果我遗漏了重要信息,请告诉我,我会很乐意添加。

谢谢!

0 个答案:

没有答案