6

我正在尝试显示存储在 Amazon S3 存储桶上的图像。URL 类似于https://s3.amazon.com/..../test.jpg。每当我在 iPhone 模拟器上执行此操作时,图像都会正确显示。但是,如果我在实际设备本身上对其进行测试,我会不断得到:

错误域=NSURLErrorDomain 代码=-1202“此服务器的证书无效。您可能正在连接到伪装成“s3.amazonaws.com”的服务器,这可能会使您的机密信息面临风险。” UserInfo=0x20007030 {NSErrorFailingURLStringKey= https://s3.amazonaws.com/.../test.jpeg , NSLocalizedRecoverySuggestion=你想连接到服务器吗? NSErrorFailingURLKey= https://s3.amazonaws.com/。 ../test.jpeg, NSLocalizedDescription=此服务器的证书无效。您可能正在连接到伪装成“s3.amazonaws.com”的服务器,这可能会使您的机密信息面临风险。NSUnderlyingError=0x20014d40“此服务器的证书无效。您可能正在连接到冒充“s3.amazonaws.com”,这可能会使您的机密信息面临风险。", NSURLErrorFailingURLPeerTrustErrorKey=}

有任何想法吗?!

谢谢!

4

2 回答 2

12

我从 S3 收到相同的证书错误,发现将其添加到 NSURLConnectionDelegate 解决了问题:

-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
   if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust] &&
       [challenge.protectionSpace.host hasSuffix:@"example.com"])
   {
       // accept the certificate anyway
       [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
   }
   else
   {
       [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
   }
}

注意:您需要将“example.com”更改为您信任的域,或者使用比“hasSuffix”更复杂的机制。

仅供参考 Apple Technote TN2232“HTTPS 服务器信任评估”详细介绍了证书被拒绝的原因以及如何处理它: https ://developer.apple.com/library/ios/technotes/tn2232/_index.html

感谢 Gordon Henriksen 在https://stackoverflow.com/a/2033823/235229上回答了这个问题,但使用的是较旧的 api。

于 2013-08-21T20:02:00.880 回答
0

您还可以检查设备日期(如果有人错误地/故意将其更改为未来),以防您拥有受信任的证书但仍然出现此错误。

于 2016-09-19T11:56:06.880 回答