2

iPhoneアプリでHTTPSを使用して、自分のAPIと通信しています。

HTTPSでパケットスニッフィングを実行しようとすると、重要な情報が表示されないことに気付きました。しかし、Fiddler2を試し、iPhoneに信頼できる証明書(Fiddler2によって発行されたもの)をインストールすると、すべてのHTTPS呼び出しを確認できました!!! これは深刻なセキュリティ問題を引き起こす可能性があります。

私は他のアプリケーションでこれを試しましたが、それらのいくつかは、Fiddlerで何とかして自分自身を保護しているかのように何も表示しません!

アプリケーションを保護するにはどうすればよいですか?

ありがとう


---選択したソリューションへの追加情報----

AFNetworkingを使用している場合、バージョン1.1以降、問題を解決するために次の操作を実行できます。

PROJECT-Prefix.pchに以下を追加します

#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1

セキュリティフレームワークが追加されていることを確認してから、AFURLConnectionOperation.mファイルにインポートします。

#import <CommonCrypto/CommonDigest.h>

この余分な関数をファイルに追加します

-(NSString*) sha256:(NSString*)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA256_DIGEST_LENGTH];

    CC_SHA256(data.bytes, data.length, digest);

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return output;
}

この行を置き換えます

if ([[[self class] pinnedCertificates] containsObject:certificateData])

これで

if ([[self sha256:[certificateData description]] isEqualToString:SSL_CERTIFICATE_SHA256])

サーバーの証明書のSHA256を計算し、プレフィックスファイルで値を定義したことを確認してください

#define SSL_CERTIFICATE_SHA256 @"<certificate SHA256 value>"

終わり!

4

1 に答える 1

3

つまり、Fiddler2 を iPhone のプロキシとして使用しています。その後、すべてのリクエストはフィドラーを通過します。Fiddler はエンド ポイントのように動作し、信頼された証明書を返します。次に、新しいリクエストを使用してリクエストを実際の URL に転送します。したがって、応答を読み取ることができます。次に、元のリクエストでデータを返します。アプリでこれを防ぎたい場合は、独自の証明書検証を追加する必要があります。バイナリレベルで証明書を確認するか、証明書を解析してフィールドを検証できます (発行者など)。

証明書のテストに関する情報を含むこのチュートリアルを見つけましたhttp://www.inmite.eu/en/blog/20120314-how-to-validate-ssl-certificates-iOS-client これも役立つかもしれません: http://www. cocoanetics.com/2013/02/rfc-dtcertificateviewer/

独自の暗号化レイヤーを追加することで、セキュリティをさらに強化することもできます。サーバーは暗号化されたデータで応答する必要があり、その応答を復号化します。

于 2013-03-07T13:17:23.513 に答える