我试图建立与Java运行SSLServerSocket的安全连接。
我已经创建了自己的根CA,并已使用该证书签署了Java SSLServerSocket证书。
我想将此根证书添加到我的应用程序,以便由根证书签名的任何证书都可以使用。
到目前为止,通过将读写流属性设置为此,安全连接可以正常工作:
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
(id)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamPropertySocketSecurityLevel,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,nil];
我将证书添加到钥匙串中,如下所示:
-(void)addRootCert{
NSString* rootCertPath = [[NSBundle mainBundle] pathForResource:@"rootCA" ofType:@"der"];
NSData* rootCertData = [NSData dataWithContentsOfFile:rootCertPath];
OSStatus err = noErr;
SecCertificateRef rootCert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)rootCertData);
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge_transfer id)kSecClassCertificate, kSecClass, rootCert, kSecValueRef, nil];
err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL);
if (err == noErr) {
NSLog(@"Sucessfully added root certificate");
}else if (err == errSecDuplicateItem){
NSLog(@"Root certificate already exists");
}else{
NSLog(@"Root certificate add failed");
}
}
很好,但是我想验证证书链,以便我的应用仅接受由我的CA(或默认的受信任证书)签名的证书
我怎样才能做到这一点?
如果设置kCFStreamSSLValidatesCertificateChain
为yes,CFNetwork SSLHandshake failed (-9807)
则会出现错误:但是如果不是,则由谁签署服务器证书都无关紧要,无论如何都将连接(我认为是对的吗?)
谢谢!
技术说明2232,“ HTTPS服务器信任评估”,应具有所需的所有答案。有有关如何评估服务器信任度的文档和一些示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句