3

Socket または SSLSocket 接続 (異なるポート) を受け入れる Java サーバーを実行しています。クライアント側では、iPhone アプリで GCDAsyncSocket を使用してサーバーに接続します。安全でないバージョン (SSL なし) を使用すると問題なく動作します。

今、SSLを使用して接続しようとしています。これを行う方法?どこから始めればよいかまったくわかりません。私の質問:

1) どのような証明書が必要ですか? Android アプリは、.bks 証明書を使用して同じサーバーで正常に動作します

2) アプリに証明書をインポートするにはどうすればよいですか? あとでAppStoreで配布してほしい。アプリのディレクトリ内に証明書ファイルを配置する必要がありますか?

3) コードのどこに証明書をロードしますか? - (void)loadCertificate { NSString *myCertificate = @"client.bks"; のようなメソッドはありますか? ... }

4) GCDAsyncSocket で SSL を有効にするには、どのパラメータを設定する必要がありますか? BOOL useSSL = true; のようなものです。...

5) 質問 1 ~ 4 が回答済みであると仮定します。今何?サーバーへの接続を開始する方法は? どのパラメーターでどのコンストラクターを使用するか?

誰かが「なぜ SSLSocket を使用し、それを使用しないのか...」と尋ねた場合。サーバーはすでにそこにあり、Android アプリでこのようにうまく機能するためです。

ご協力ありがとうございました!

4

1 に答える 1

7

これは古い質問ですが、他の人の助けになることを願っています。

  1. 私は pfx を好みましたが、bks も問題ないと思います。
  2. はい、その証明書をバンドルに入れる必要があります。
  3. didConnectToHost メソッドで SSL 設定を行う必要があります。
  4. [sock startTLS:sslSettings];

最後に、CocoaAsyncSocket フォルダーに ConnectTest というサンプル アプリケーションがあります。最初に確認する必要があります。

NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init];
        NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"bks"]];
        CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(pkcs12data);
        CFStringRef password = CFSTR("YOUR PASSWORD");
        const void *keys[] = { kSecImportExportPassphrase };
        const void *values[] = { password };
        CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

        CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

        OSStatus securityError = SecPKCS12Import(inPKCS12Data, options, &items);
        CFRelease(options);
        CFRelease(password);

        if(securityError == errSecSuccess)
            NSLog(@"Success opening p12 certificate.");

        CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
        SecIdentityRef myIdent = (SecIdentityRef)CFDictionaryGetValue(identityDict,
                                                                      kSecImportItemIdentity);

        SecIdentityRef  certArray[1] = { myIdent };
        CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);

        [sslSettings setObject:(id)CFBridgingRelease(myCerts) forKey:(NSString *)kCFStreamSSLCertificates];
        [sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel];
        [sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
        [sslSettings setObject:@"CONNECTION ADDRESS" forKey:(NSString *)kCFStreamSSLPeerName];
        [sock startTLS:sslSettings];
于 2013-09-24T06:28:04.427 に答える