2

私はObjectiveCとHTTPsに非常に慣れていません。この件について教えてください。

HTTPを介してサーバーと通信するためにiPhoneアプリケーションが必要です。自己署名証明書を作成しました。ブラウザを介してURLにアクセスすると、サーバーが信頼されていないという警告メッセージが表示されますが、機能します。それで大丈夫です。

iPhoneアプリからHTTPリクエストを送信します。HTTPS経由でASIHTTPRequestを使用しています。しかし、「接続障害が発生しました:SSLの問題(考えられる原因には、証明書の不良/期限切れ/自己署名、時計の日付が間違っているなど)」というエラーメッセージが表示されます。

私はStackoverflowを閲覧し、次の方法でそれを行うことを学びました。

  1. ブラウザから証明書をダウンロードし、Xcodeプロジェクトに含めました。
  2. NSDataに証明書をロードします

    NSString * fullFileName = @ "myCertificate.cer"; NSString * fileName = [[fullFileName lastPathComponent] stringByDeletingPathExtension]; NSString*拡張=[fullFileNamepathExtension]; NSData * PKCS12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:extension]];

  3. アイデンティティを抽出する

    [self extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data password:@ "myCertificatePasswordHere"];

  4. HTTPS経由でHTTPリクエストを送信する

    ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:myHTTPsURLHere]; [リクエストsetClientCertificateIdentity:identity]; [リクエストstartSynchronous];

  5. ここで多くの人が提案したように、私もASIHTTPRequest.mを変更し、

[sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates]; [sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots];

IFステートメントに

   if (![self validatesSecureCertificate]) {

     NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                           [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                           kCFNull,kCFStreamSSLPeerName,
                                           @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
                                           nil];

    CFReadStreamSetProperty((CFReadStreamRef)[self readStream], 
                                    kCFStreamPropertySSLSettings, 
                                    (CFTypeRef)sslProperties);


            [sslProperties release];
        }else {
            NSMutableDictionary *sslProperties = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                           [NSNumber numberWithBool:NO], kCFStreamSSLAllowsExpiredCertificates,
                                           [NSNumber numberWithBool:NO], kCFStreamSSLAllowsAnyRoot,
                                           [NSNumber numberWithBool:YES],  kCFStreamSSLValidatesCertificateChain,
                                           @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
                                           nil];

            CFReadStreamSetProperty((CFReadStreamRef)[self readStream], 
                                    kCFStreamPropertySSLSettings, 
                                    (CFTypeRef)sslProperties);

            [sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates]; // Sergey added this line
            [sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots]; // Sergey added this line 
            [sslProperties release];
        } 

しかし、それは役に立ちません:(。私はまだエラーメッセージを受け取っています:

  Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)"

クライアント証明書がサーバーによって検証されるように、HTTPを介してASIHTTPRequestを作成する方法を教えてください。プライベートAPIを使いたくない...

どうもありがとうございます!

4

1 に答える 1

1

確かにASIHttpRequestとiOS5にはバグがあります。私にとってうまくいった良い修正はこれでした:james-chalfantによるiOS 5(代替)での自己署名クライアント証明書の修正

于 2012-12-28T10:48:49.227 に答える