NSURLConnectionでSSL認証(p12)をする事がありましたのでサンプルコードを乗せておきます。
自由に使用してください。
サンプルコードの説明
p12ファイル”newcert.p12″を読み込み、newcert.p12のpasswordは”pkcs23password”となります。
当たり前ですが、パスワードとp12ファイルはダンプしても見えないように暗号化しましょう。
使用メソッド
<NSURLConnectionDelegate>
– (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
Sample Code
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ( [challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic] ||
        [challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPDigest] )
    {
        NSLog(@"Basic認証");
    }
    else if ( [challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust] ||
             [challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate])
    {
        NSLog(@"SSL認証(p12)");
        OSStatus status;
        CFArrayRef importedItems = NULL;
        // パスワード設定
        NSString *password = @"pkcs23password";
        // 認証データP12のファイルを読み込み
        NSData *PKCS12Data = [NSData dataWithContentsOfFile:@"newcert.p12"];
        status = SecPKCS12Import((__bridge CFDataRef)PKCS12Data,
                                 (__bridge CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys:password,
                                                             kSecImportExportPassphrase,
                                                             nil],
                                 &importedItems);
        if (status == errSecSuccess) {
            NSArray* items = (__bridge NSArray*)importedItems;
            SecIdentityRef identityRef = (__bridge SecIdentityRef)[[items objectAtIndex:0] objectForKey:(__bridge id)kSecImportItemIdentity];
            NSURLCredential* credential = [NSURLCredential credentialWithIdentity:identityRef
                                                                     certificates:nil
                                                                      persistence:NSURLCredentialPersistenceNone];
            // 認証送信(?)
            [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
            if (importedItems != NULL)
                CFRelease(importedItems);
        }
    }
}
以上、
  
  
  
  

コメント