0

GCDAsyncSocket を使用して、保護が弱いサーバー (つまり、anon 暗号を使用して接続できるもの) を作成しようとしています。私が現在行っていることは次のとおりです。

  1. ポートにバインドしてリッスンを開始する

    ...
    BOOL result = [serverSocket acceptOnPort:port error:&error];
    ...
    
  2. 次に、指定したポートに接続が到着すると、- (void)socket:(GCDAsyncSocket *)sender didAcceptNewSocket:(GCDAsyncSocket *)newSocketコールバックで受信します。ここでは、SSL/TLS 設定で辞書を作成します。

    NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
    NSArray* ciphers = [[NSArray alloc] initWithObjects: [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_AES_256_CBC_SHA256], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_AES_256_CBC_SHA], [NSNumber
    numberWithUnsignedInt:SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA] , [NSNumber
    numberWithUnsignedInt:SSL_DH_anon_EXPORT_WITH_RC4_40_MD5] , [NSNumber
    numberWithUnsignedInt:SSL_DH_anon_WITH_DES_CBC_SHA], [NSNumber
    numberWithUnsignedInt:SSL_DH_anon_WITH_RC4_128_MD5], [NSNumber
    numberWithUnsignedInt:SSL_NULL_WITH_NULL_NULL], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_3DES_EDE_CBC_SHA], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_AES_128_CBC_SHA], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_AES_128_CBC_SHA256], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_AES_128_GCM_SHA256], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_AES_256_GCM_SHA384], [NSNumber
    numberWithUnsignedInt:TLS_DH_anon_WITH_RC4_128_MD5], nil]; //all anon ciphers
    
    [settings setObject:ciphers forKey:GCDAsyncSocketSSLCipherSuites];
    
    //this is a server
    [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString*)kCFStreamSSLIsServer];
    
    [newSocket startTLS:settings]; //apply the settings to new connection
    
  3. を呼び出して設定を適用した後startTLS、 がnewSocket切断され- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)error、 が呼び出されます。エラー コードは 9800 (errSSLProtocol) です。

質問: 私が間違っている/していないことは何ですか?

私の推測では、私が指定していない証明書と関係があると思います。しかし、匿名暗号を行っている場合、証明書を指定する必要がありますか?

4

1 に答える 1

0

やっと分かったみたいです。上記のコードは完全に正しいです。問題は、デフォルトで SSLv2 を使用する OpenSSL ベースのクライアントを使用して接続していたことです。SSLv2 は OpenSSL にバグのある実装を持っているため、OpenSSL を使用する他のコンポーネントとはうまく通信できますが、同じプロトコルの他の実装 (Apple のものなど) とは完全に互換性がないことが判明しました。この問題は、正しく実装されている TLSv1 を代わりに (SSLv3 であったとしても) 使用するようにクライアントに強制することで解決されました。

于 2014-08-29T03:11:39.680 に答える