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 ####### 的服务器,这可能会使您的机密信息面临风险。, _kCFNetworkCFStreamSSLErrorOriginalValue=-9813, _kCFStreamPropertySSLClientCertificateState=0, NSLocalizedRecoverySuggestion=你愿意吗还是想连接到服务器?

但我设置

disableCertificationValidation

我还尝试按照RestKit Pull此处的信息进行操作。但这也完全没有帮助。有没有人有想法,有什么问题?使用 AFNetwork 库,代码或多或少是相同的,但可以工作。

4

3 回答 3

0

我也是 RestKit 的新手,但我刚刚开始使用 HTTP Basic Auth,主要使用您的示例和以下两个更改:

  • 您不需要disableCertificateValidation基本身份验证,因为仅在使用 SSL 连接时才需要此方法。所以删除那个。
  • 当您同步发送请求时,您不需要委托或接收器方法,您可以稍后简单地评估您的响应一行代码。

如果它仍然不起作用,请检查您的 URL 是否最终正确,方法是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 回答
0

就我而言,我在 RKClient 上设置了 disableCertificateValidation,但我使用的是使用不同 RKClient 的 RKObjectManager。以下行起到了作用:

[RKObjectManager sharedManager].client.disableCertificateValidation = YES;
于 2013-09-10T11:40:33.037 回答