我正在尝试设置与 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
为是,我会收到错误:CFNetwork SSLHandshake failed (-9807)
但如果不是,那么谁签署了服务器证书并不重要,它会连接无论如何(我认为这是对的?)
谢谢!