7

ホームルーターのウェブインターフェースに接続するアプリがあります。これをhttpだけでなくhttpsを使用するように変換したいと思います。元々はを使用して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:

url i safariに移動すると、SafariがIDを確認できないというメッセージが表示されます。続行するには、[続行]をクリックする必要があります。どうすればこれを達成できますか?残念ながら、SSLやhttpsについては何も知りません。これが私が現在使用しているコードです:

NSString *urlString = @"https://192.168.1.1/";
NSURL *url = [NSURL URLWithString:urlString];

// Set authorization
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
[httpClient setAuthorizationHeaderWithUsername:user password:pass];

NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"Info.live.htm" parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *responceString = [operation responseString];
    //        NSLog(@"%@",responceString);
    if ([self parseInfoLive:responceString])
        [[NSNotificationCenter defaultCenter] postNotificationName:@"downloadsComplete" object:nil];
}
                                 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                     NSLog(@"ERROR: %@",error.description);
                                 }];


[operation start];
4

3 に答える 3

16

ホスト証明書の有効性チェックを回避するには、次のコードを追加します。

まず、すでにSDK内にあるが、公開されていないsetterメソッドのインターフェイスを追加します。

@interface NSURLRequest(Private)
+(void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;
@end

これで、新しいリクエストをレンダリングするときはいつでも、そのセッターを呼び出します。

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

警告

このコードを本番環境で使用しないでください。証明書がまだ承認/送信/インストールされていない場合にのみ、アプリの開発中に使用してください。通常は、信頼できる証明書がインストールされていない開発サーバーを使用します。このコードを使用すると、プライベートAPIメソッドを使用するため、iTunesを介した配布が拒否されます。

実稼働環境で物事がスムーズに機能することを確認するには、ホストの信頼できるSSL証明書を取得する必要があります。そのようなものを提供している様々な権威ある会社があります。少なくとも1つ(もっとたくさんあります)に言及するには、GoDaddyを使用できます。


更新(2013年5月31日)

AFNetworkingは、プライベートAPIを使用せずに、すぐに使用できる無効な証明書をサポートするように更新されました。ピーターシュタインバーガーに称賛を!

その機能を有効にするための最も便利な解決策は、プレフィックスヘッダー(.pch)に以下を追加することです。

#ifdef DEBUG
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_
#endif

繰り返しになりますが、本番コードでその機能を有効にしないようにする必要があることを強調することはできません。SSL接続のポイント全体が無効になり、脆弱になります。

于 2012-09-16T13:46:41.137 に答える
1

AppleのドキュメントからのこのURLはこのリンクを確認するのに役立つかもしれません

上記のドキュメントの「はじめに」セクションをお読みください。 Appleドキュメントのスクリーンショット

于 2014-09-25T12:48:40.367 に答える
0

私はAFNetworkingに精通していませんが、表示されているエラーを回避する解決策がここにあります。Tillの回答は、アプリをアプリストアに送信できないようにするために評判が高いです。

于 2013-02-25T19:11:55.400 に答える