私は、Webアプリケーションと外部サーバーとの間のプロキシとして機能するために、のHTTPSサーバーをiOSアプリケーション内に構築しようとしています。iOS上でHTTPSサーバーを実行するためのSSL ID証明書
私はCFSocketRefのおかげで、あるいはGCDAsyncSocketライブラリを使ってソケットを聞いてHTTPサーバを作ることができました。私はまた、GCDAsyncSocketライブラリと私の方法のおかげで使用して、HTTPSサーバを実行しているMacのアプリを作るために成功してきた 「にSecureSocketを:」接続を確保し、それ以下:
- (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];
}
私が使用している証明書が自己であります署名付きサーバーSSL証明書私はKeychain Accessで作成しました。 IDと証明書を含む配列が設定されているシステムを設定する必要があることを理解しています。それは私のMacアプリでうまく動作します。
問題は、iOSアプリケーションのHTTPサーバーでSSLを有効にすることです。 アイデンティティを作成するメソッド「SecIdentityCreateWithCertificate()」はiOSには存在しません。アイデンティティを作成する方法は別の方法ではわかりません。
iOSでSecIdentityRefを作成する方法(SSLサーバー側を有効にする方法)は私のアプリに公開鍵/秘密鍵を保存するのが好きなのですか?どうもありがとうございます。
これはCocoaAsyncSocket v7.4で変更されました。一部の古いオプションキーは使用できなくなり、例外がスローされます。 GCDAsyncSocketManuallyEvaluateTrustを使用し、-socket:didReceiveTrust:delegateで評価してください。私の例をhttps://gist.github.com/hlung/6432966 – Hlung