我把头发拉出来,非常感谢一些帮助。不幸的是,我对SSL的体验非常有限,所以我不知道自己哪里出错了。
我需要开发一个iOS应用程序,它充当与客户端进行相互SSL身份验证的服务器。我使用GCDAsyncSocket库并且我设法使服务器部分正常工作(没有SSL),但是,我仍然无法使SSL工作。我已经看过这个post了,但是,它并没有解释为实现我想要的目标而需要执行的步骤。
在证书设置方面,我有以下p12证书:
然后我在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是'其他'
我不知道出了什么问题......也许我做了一些根本错误的事情,如果是这样的话,我非常感谢有人指出:)
此外,一旦我完成了这一步,我如何在发送客户端证书时验证它?
如果我遗漏了重要信息,请告诉我,我会很乐意添加。
谢谢!