sto cercando di impostare una connessione sicura a uno SSLServerSocket eseguire Java.connessione SSL Socket iOS
Ho creato il mio CA principale, e ho firmato il certificato che lo SSLServerSocket Java utilizzando questo certificato.
voglio aggiungere questo certificato principale per la mia app in modo che qualsiasi certificato firmato dal certificato principale funzionerà.
Finora ho la connessione sicura lavorando bene impostando la lettura e scrittura proprietà del flusso a questo:
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
(id)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamPropertySocketSecurityLevel,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,nil];
aggiungo il certificato al portachiavi in questo modo:
-(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");
}
}
Questo è bene, ma voglio convalidare la catena di certificati, in modo che la mia app accetta solo certificati firmati dal mio CA (o quelli di fiducia di default)
Come posso fare questo?
Se ho impostato kCFStreamSSLValidatesCertificateChain
di sì, ottengo l'errore: CFNetwork SSLHandshake failed (-9807)
ma se è no, non importa che ha firmato il certificato del server, si collegherà a prescindere (suppongo che è di destra?)
Grazie!
Grazie per questo collegamento, seguendo quello che dice sull'uso di "SecTrustSetAnchorCertificates" Voglio aggiungere il mio root ca a questo, ma non ho un "SecTrustRef', come posso crearne uno? Tutti gli esempi che ho visto sta utilizzando 'metodi delegato NSURLConnection', ma sto usando prese .. –
Questo è probabilmente quello che stai cercando: https://developer.apple.com/library/mac/documentation/NetworkingInternet /Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html – quellish
Grazie, l'ultimo collegamento era perfetto! –