我正在尝试建立到Java运行的SSLServerSocket的安全连接。
我已经创建了自己的根CA,并使用此证书签名了Java SSLServerSocket使用的证书。
我想将此根证书添加到我的应用程序中,以便任何由根证书签名的证书都可以正常工作。
到目前为止,我已经通过将读写流属性设置为以下内容使安全连接正常工作:
这很好,但我希望验证证书链,以便我的应用程序只接受由我的CA(或默认的受信任证书)签名的证书。
我该怎么做?
如果我将
谢谢!
我已经创建了自己的根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)
,但如果设置为否,不管谁签署了服务器证书,都可以连接(我认为是这样的?)谢谢!
SecTrustSetAnchorCertificates
的说明,我想将我的根证书添加到其中,但我没有SecTrustRef
,我该如何创建一个?所有我看到的例子都是使用NSURLConnection
委托方法,但我正在使用套接字。 - ABC