我想忽略证书验证,在哪里以及如何使用XMLRPC Web服务?

时间:2010-10-12 15:53:05

标签: iphone xml-rpc simplexmlrpcserver

我正在访问Web服务并在尝试连接时遇到此错误(Web服务是XMLRPC,我使用wordpress xmlrpc源代码进行请求和处理repsonse):

错误域= NSURLErrorDomain代码= -1202“此服务器的证书无效。您可能正在连接到假装为” ** .org“的服务器,这可能会对您造成保密有风险的信息。“

WebService的人说要忽略证书验证部分,所以如果有人知道怎么做,那将对我有很大的帮助。

在一些建议之后我使用了下面的NSURLConnection委托,stil同样的错误

 -(BOOL)connection:(NSURLConnection *)connection  canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {  
 return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
 }   

 -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {  
 if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])  
if ([trustedHosts containsObject:challenge.protectionSpace.host])  
  [challenge.sender useCredential:[NSURLCredential  credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];  
  [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

4 个答案:

答案 0 :(得分:11)

截至目前,周杰伦给出了正确答案。但是这两种方法现在已被弃用。

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace // deprecated over iOS 5.0. Not even called in iOS 7.0

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge // deprecated over iOS 5.0. Not even called in iOS 7.0

因此,您可以使用该方法:

-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
        [[challenge sender] useCredential:[NSURLCredential credentialForTrust:[[challenge protectionSpace] serverTrust]] forAuthenticationChallenge:challenge];
    }
}

我使用这段代码来克服下面列出的错误:

  

错误域= NSURLErrorDomain代码= -1202"此服务器的证书无效。您可能正在连接到假装为“app。*****。com”的服务器,这可能会使您的机密信息面临风险。

答案 1 :(得分:7)

正如aegzorz所说,[NSURLRequest +setAllowsAnyHTTPSCertificate:forHost:]是私有API,不应在生产代码中使用。由于它是一个私有API,因此它肯定会被App Store拒绝。处理不受信任证书的已发布方式是使用NSURLConnection委托方法-connection:canAuthenticateAgainstProtectionSpace:-connection:didReceiveAuthenticationChallenge:

您可以使用这些API做很多事情,处理可以想象的各种身份验证问题。我建议您学习Apple的示例代码AdvancedURLConnections

答案 2 :(得分:4)

我正在使用以下内容在开发中的应用中进行测试:

NSURL* url = // url to webservice
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

请注意,这是私有API ,请勿在生产代码中使用它。

答案 3 :(得分:1)

如果您使用的是AFNetworking,则可以使用以下代码:

(正如临时客户端解决方案!)

AFHTTPSessionManager * apiManager = [AFHTTPSessionManager initWithBaseURL:[NSURL URLWithString:baseURL];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
policy.allowInvalidCertificates = YES;
apiManager.securityPolicy = policy;