4

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

错误域=NSURLErrorDomain 代码=-1202 “此服务器的证书无效。您可能正在连接到伪装成“<strong>**.org”的服务器,这可能会使您的机密信息面临风险。”

WebService 人们说要忽略证书验证部分,所以如果有人知道如何做到这一点,那将对我有很大帮助。

经过一些建议,我使用了下面的 NSURLConnection 委托,仍然是同样的错误

 -(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

4 回答 4

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”的服务器,这可能会使您的机密信息面临风险。

于 2014-07-20T05:58:39.920 回答
7

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

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

于 2010-10-12T19:25:39.593 回答
4

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

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

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

于 2010-10-12T16:02:05.473 回答
1

如果您正在使用AFNetworking,则可以使用以下代码:

(就像一个临时的客户端解决方案!)

AFHTTPSessionManager * apiManager = [AFHTTPSessionManager initWithBaseURL:[NSURL URLWithString:baseURL];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
policy.allowInvalidCertificates = YES;
apiManager.securityPolicy = policy;
于 2014-04-23T15:42:54.800 回答