0

基本認証を使用してサーバーに投稿リクエストを送信しようとしています。AFNetwork ライブラリで試してみたところ、うまくいきました。私はRestkitを使いたいと思っていて、多くのことのためにすでに使っていたので、同じことをしようとしましたが、うまくいきません。私のコードは次のようになります。

    RKClient *client = [[RKClient alloc] initWithBaseURL:URL];
    client.username = @"username";
    client.password = @"password";
    client.authenticationType = RKRequestAuthenticationTypeHTTPBasic;
    client.disableCertificateValidation = YES;


    RKRequest *request = [client post:@"mypath" params:nil delegate:self];
    [request sendSynchronously];

しかし、デリゲートでは

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error {

私はいつもエラーが発生します:

NSLocalizedDescription=このサーバーの証明書は無効です。####### HIDDEN ####### のふりをしているサーバーに接続している可能性があります。これにより、機密情報が危険にさらされる可能性があります。とにかくサーバーに接続したいですか?

しかし、私は

disableCertificationValidation

はいへ

ここの情報に従ってもみましたRestKit Pull。しかし、それもまったく役に立ちませんでした。何が間違っている可能性がありますか?AFNetwork ライブラリを使用すると、コードは多かれ少なかれ同じですが、機能します。

4

3 に答える 3

0

私もRestKitは初めてですが、主にあなたの例と次の2つの変更を使用して、HTTP Basic Authが機能するようになりました。

  • disableCertificateValidationこのメソッドは SSL 接続を使用する場合にのみ必要になるため、基本認証は必要ありません。だから、それを削除します。
  • リクエストを同期的に送信しているため、デリゲート メソッドやレシーバー メソッドは必要なく、コードの 1 行後にレスポンスを評価するだけで済みます。

それでもうまくいかない場合はNSLog(@"URL: %@", [[request URL] absoluteString]);、リクエストの初期化とsendSynchronously

これが役に立てば幸いです。

于 2012-11-09T03:54:27.387 に答える
0

少なくとも、RestKit で解決策を得ることができませんでした。私はすべてを試し、addRootCertificates で証明書を追加しましたが、RestKit は常に同じエラーを受け取ります。結局、自分でやりました。

NSData* certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"MyCert" ofType:@"cer"]];

[FileUtility addCertToKeychain:certData];

メソッド addCertToKeychain:

#pragma mark SSL Certification Methods
+ (void) addCertToKeychain:(NSData*)certInDer
{
    OSStatus            err = noErr;
    SecCertificateRef   cert;

    cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certInDer);
    assert(cert != NULL);

    CFTypeRef result;

    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          (__bridge id)kSecClassCertificate, kSecClass,
                          cert, kSecValueRef,
                          nil];

    err = SecItemAdd((__bridge CFDictionaryRef)dict, &result);
    assert(err == noErr || err == errSecDuplicateItem);

    CFRelease(cert);
}

おそらくそれは誰かを助けます。

于 2012-11-09T07:16:51.813 に答える