Ios 从http切换到https。无效证书

Ios 从http切换到https。无效证书,ios,objective-c,ssl,https,afnetworking,Ios,Objective C,Ssl,Https,Afnetworking,我有一个应用程序可以连接到我的家庭路由器web界面。我想将其转换为使用https,而不仅仅是http。 我最初使用的是ASIHttpRequest,但由于它不再受支持,我将切换到AFNetworking。 问题是,每当我尝试连接时,都会收到以下错误消息: _block_invoke_0220 [Line 243] ERROR: Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid.

我有一个应用程序可以连接到我的家庭路由器web界面。我想将其转换为使用https,而不仅仅是http。 我最初使用的是
ASIHttpRequest
,但由于它不再受支持,我将切换到
AFNetworking
。 问题是,每当我尝试连接时,都会收到以下错误消息:

_block_invoke_0220 [Line 243] ERROR: Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “192.168.1.1” which could put your confidential information at risk." UserInfo=0x9792ad0 {NSErrorFailingURLStringKey=https://192.168.1.1/Info.live.htm, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey=https://192.168.1.1/Info.live.htm, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “192.168.1.1” which could put your confidential information at risk., NSUnderlyingError=0xa6a3560 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “192.168.1.1” which could put your confidential information at risk.", NSURLErrorFailingURLPeerTrustErrorKey=< SecTrustRef:

要绕过主机证书的有效性检查,请添加以下代码

首先为setter方法添加一个接口,该接口已在SDK中,但未公开:

@interface NSURLRequest(Private)
+(void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;
@end
现在,无论何时呈现新请求,都要调用该setter:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[inURL host]];
警告

请勿将此代码用于生产,而仅在证书尚未批准/提交/安装的情况下开发应用程序时使用。典型的情况是使用未安装可信证书的开发服务器。 使用此代码将导致您的应用程序被iTunes拒绝发布,因为它使用私有API方法。

为了确保在生产环境中顺利工作,您必须为主机获得受信任的SSL证书。有各种权威公司提供这种东西。至少要提到一个(还有更多),您可以使用


更新(2013年5月31日)

在不使用任何私有API的情况下,支持现成的无效证书。感谢彼得·斯坦伯格

要启用该功能,最方便的解决方案是在前缀头(.pch)中添加以下内容:


再次强调,您应该避免在生产代码中启用该功能,这一点再怎么强调也不为过——这将使整个SSL连接点失效,并使其易受攻击。

我不熟悉AFNetworking,但有一种解决方案可以解决您看到的错误。Till的答案据说会阻止你将应用提交到应用商店。

苹果文档中的这个URL可能会有所帮助

在上述文件中,请阅读引言部分。

证书显然不受您提交的主机的信任。您必须禁用有效性检查才能使此工作-警告不要将此类应用提交到应用商店,而只能在您的开发阶段使用此类解决方案。谢谢。如何禁用有效性检查?我已尝试将#define AFNETWORKING _ALLOW _INVALID _SSL _certificates1添加到代码顶部。此外,如果你说不要这样提交应用程序,有什么解决方案可以使证书可信?谢谢。现在可以了。我想我必须与请求此操作的人交谈,以查看他们是否拥有有效的证书。是否可以将自签名证书添加到应用程序中,以便在使用safari导航到url时可以接受?您应该避免在生产环境中使用自签名证书。使用一个被正确接受的证书,它真的没有那么难或昂贵。问题是,我的应用程序连接到用户服务器。所以他们需要自己的服务器。但是服务器的默认设置是自签名的。这里可以找到一个答案,显示用于处理自签名证书的公共API:引用的解决方案不使用AFNetworking,因此它没有回答问题。
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[inURL host]];
#ifdef DEBUG
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_
#endif