Ich versuche, einen HTTPS-Server in einer iOS-App zu erstellen, um als Proxy zwischen meiner Web-App und meinem externen Server zu fungieren.SSL-Identitätszertifikat zum Ausführen eines HTTPS-Servers unter iOS
Ich habe es geschafft, einen HTTP-Server durch Abhören eines Sockets zu erstellen, entweder dank CFSocketRef oder mithilfe der GCDAsyncSocket-Bibliothek. Ich habe auch einen Mac App einen HTTPS-Server ausgeführt wird, mit der GCDAsyncSocket Bibliothek und dank meiner Methode „Secure:“ make erfolgreich zu sein, unter dem sichert die Verbindung:
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
// (...)
// secure the connection
[self secureSocket:newSocket];
// (...)
}
- (void)secureSocket:(GCDAsyncSocket *)sock
{
// The root self-signed certificate I have created
NSString *certificatePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"];
NSData *certData = [[NSData alloc] initWithContentsOfFile:certificatePath];
CFDataRef certDataRef = (CFDataRef)certData;
SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef);
[certData release];
// the "identity" certificate
SecIdentityRef identityRef;
SecIdentityCreateWithCertificate(NULL, cert, &identityRef);
// the certificates array, containing the identity then the root certificate
NSArray *certs = [[NSArray alloc] initWithObjects:(id)identityRef, (id)cert, nil];
// the SSL configuration
NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3];
[settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName];
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots];
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates];
[settings setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
[settings setObject:(NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString*)kCFStreamSSLLevel];
[settings setObject:certs forKey:(NSString *)kCFStreamSSLCertificates];
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLIsServer];
[sock startTLS:settings];
[certs release];
}
Das Zertifikat ich benutze ist ein Selbst -signiertes Server-SSL-Zertifikat, das ich mit Keychain Access erstellt habe. Also verstehe ich, dass ich dem System eine Konfiguration mit einem Array geben muss, das eine Identität und ein Zertifikat enthält. Und es funktioniert gut auf meiner Mac-App.
Das Problem besteht darin, das SSL auf dem HTTP-Server meiner iOS-App zu aktivieren. Die Methode "SecIdentityCreateWithCertificate()", die die Identität erstellt, existiert nicht auf iOS und ich weiß nicht, wie man eine Identität auf andere Weise erstellt.
Wie erstellt man eine SecIdentityRef auf iOS (um die SSL-Server-Seite zu aktivieren)? Habe ich etwas vermisst gerne den öffentlichen/privaten Schlüssel in meiner App oder etwas anderes zu speichern? Ich danke dir sehr.
Es wurde in CocoaAsyncSocket v7.4 geändert, einige alte Optionsschlüssel sind jetzt nicht verfügbar und werden Ausnahme auslösen. Verwenden Sie GCDAsyncSocketManuallyEvaluateTrust und evaluieren Sie stattdessen in -socket: didReceiveTrust: delegate. Sehen Sie mein Beispiel in https://gist.github.com/hlung/6432966 – Hlung