2009-09-22 48 views
20

私はクライアント証明書認証で戦っています。私は、ファイルから証明書をロードする資格を満たし、この方法を実行したいiPhone:HTTPSクライアント証明書

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 

::サーバはクレデンシャル(この場合は証明書)を必要とする場合、このメソッドはNSURLConnectionからデリゲートを呼び出され

[[challenge sender] useCredential:[self credential] forAuthenticationChallenge:challenge]; 

しかし、私はSecIdentityRefパラメータを初期化する(または記入)する方法がわかりません。以下は、資格情報を作成する私のコードです:

NSString *certPath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"]; 
NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath]; 

SecIdentityRef myIdentity; // ??? 

SecCertificateRef myCert = SecCertificateCreateWithData(NULL, (CFDataRef)certData); 
[certData release]; 
SecCertificateRef certArray[1] = { myCert }; 
CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL); 
CFRelease(myCert); 
NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity 
            certificates:(NSArray *)myCerts 
            persistence:NSURLCredentialPersistencePermanent]; 
CFRelease(myCerts); 

誰かがそれを解決する方法を知っていますか?ありがとう。


私は最終的に解決策を見つけましたが、新たな問題がここにある:

私のクライアントは、サーバーに証明書を送信しません。サーバが証明書を要求した後、アプリケーションは、この方法で実行:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 

および(私は上記のように)私が資格を満たすが、接続はエラーで終了:NSURLErrorDomain -1206。サーバーログによれば、クライアント証明書はアプリケーションによって送信されません。

誰でもこの動作の経験がありますか?アプリケーションの証明書を何とか検証する必要がありますか?それを動作させるために何か他に?私が助けてくれれば私の現在のコードを提供することができます。もちろん、任意のアイデアをお寄せいただきありがとうございます...

答えて

0

は問題がXcodeでiPhoneシミュレータでいた:)バージョン3.1にアップデートした後、それは仕事を始め...

+3

ご質問を読みやすくするためだけヒント:新しい答えとしてはいけないポストの質問。スレッドを読みにくくする傾向があります。あなたの質問は他の人にはおそらく有用であることを忘れないでください。あなたのプロセスと最終的な答えを見ることができることが重要です。ありがとう! – mtmurdock

4

私はこれらの手順を使用します。

    SecCertificateRef

とtを取得するためにSecPKCS12Import機能

  • 使用SecIdentityCopyCertificate機能を使用してPKCS12証明書ファイルから
  • 抽出SecIdentityRef彼は残り(信任状の初期化)は私の質問と同じです...あなたが望むなら私はここにもっとコードを置くことができます。 iphoneシミュレータにはバグ(http://openradar.appspot.com/7090030)があるので、シミュレータ内で多くの証明書を扱うことはできません。

  • 1

    あなたがそこにこの情報を保存する場合にも、キーチェーンにアイデンティティを検索することができます。

    + (SecIdentityRef)dumpSecIdentityRef 
    { 
    OSStatus err; 
    CFArrayRef result; 
    CFIndex  resultCount; 
    CFIndex  resultIndex; 
    
    result = NULL; 
    err = SecItemCopyMatching((__bridge CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys: 
                     (__bridge id)kSecClassIdentity, 
                     kSecClass, kSecMatchLimitAll, 
                     kSecMatchLimit, kCFBooleanTrue, 
                     kSecReturnRef, kCFBooleanTrue, 
                     kSecReturnAttributes, nil], 
              (CFTypeRef *) &result); 
    
    if ((result != NULL) && (err == noErr)) { 
    
        NSMutableArray *identitiesArray = [NSMutableArray new]; 
    
        resultCount = CFArrayGetCount(result); 
        for (resultIndex = 0; resultIndex < resultCount; resultIndex++) { 
         NSDictionary * thisResult; 
         thisResult = (__bridge NSDictionary *) CFArrayGetValueAtIndex(result, resultIndex); 
         NSLog(@"%@", (__bridge id)(result)); 
         [identitiesArray addObject:thisResult]; 
        } 
    
        CFRelease(result); 
        //TO DO - choose correct identity object from array. 
        SecIdentityRef myIdentity = (__bridge SecIdentityRef)([[identitiesArray objectAtIndex:0] valueForKey:@"v_Ref"]); 
    
        return myIdentity; 
    } 
    return nil; 
    } 
    
    関連する問題