アプリを使用してサーバーへのHTTPS接続を確立しようとしています。しかし、次のエラーにより接続は失敗します
Error Domain = NSURLErrorDomain Code = -1200 "SSLエラーが発生し、サーバーへの安全な接続を確立できません。" UserInfo = 0x612eb30 {NSErrorFailingURLStringKey = https:myURL.com/signup、NSLocalizedRecoverySuggestion =サーバーに接続しますか?、NSErrorFailingURLKey = https:myURL.com/signup、NSLocalizedDescription = SSLエラーが発生し、サーバーを作成できません。、NSUnderlyingError = 0x612eb70 "SSLエラーが発生し、サーバーへの安全な接続を作成できません。"}
サーバーに接続するコードは
-(IBAction) handleEvents:(id)sender
{
if ((UIButton*)sender == submit) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSLog(@"Begin");
NSData *urlData;
NSURLResponse *response;
NSError *error;
NSString *url =[[NSString alloc]initWithFormat:@"%@signup",baseURL];
NSURL *theURL =[NSURL URLWithString:url];
NSMutableURLRequest *theRequest =[NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:0.0f];
[theRequest setHTTPMethod:@"POST"];
NSString *theBodyString = [NSString stringWithFormat:@"emailId=%@&mobileNumber=%@&appId=%@&password=%@&firstName=%@&lastName=%@"
,@"[email protected]",@"919879876780",@"bf1c7a6b3d266a7fe350fcfc4dda275211c13c23" ,@"qwerty" , @"Dev" , @"Sri"];
NSData *theBodyData = [theBodyString dataUsingEncoding:NSUTF8StringEncoding];
[theRequest setHTTPBody:theBodyData];
urlData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
}
}
私のデリゲートメソッドは
- (void)handleError:(NSError *)error
{
NSLog(@"----->%@",error);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge (NSURLAuthenticationChallenge *)challenge {
NSLog(@"check auth");
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
私はここで立ち往生しており、道を見つけることができませんでした。
どんな形の助けも大歓迎です。
前もって感謝します!!
それは長い間未回答のままであり、私の研究と現在の開発は、コードが接続、認証されたCAによって署名されていないサーバーでの証明書に完全に適していることを示しています。そのため、この種の問題がある場合は、証明書がサーバー側で有効かどうかを確認してください。
これが役立つことを願っています!!
iOS 9は、HTTPSを使用している接続を最近の脆弱性を回避するためにTLS 1.2に強制します。 iOS 8では、暗号化されていないHTTP接続もサポートされていたため、TLSの古いバージョンでも問題は発生しませんでした。回避策として、次のコードスニペットをInfo.plistに追加できます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
これにより、App Transport Securityを無効にします。お役に立てば幸いです。
デバイスの日付と時刻が間違っている可能性があります:)
このページをご覧ください: https://github.com/vinhnx/iOS-issues/issues/1
簡単に言うと、理由は、iOS9およびOSX 10.11以降、XCode7で構築されたすべてのアプリはSSL接続にTLS 1.2を必要とし、以前のプロトコルでは失敗するためです。
この問題を解決するにはいくつかの方法があります。
「NSAppTransportSecurity-> NSAllowsArbitraryLoads」アプローチは、アプリからのすべての接続でTLS 1.2を無効にするため、Appleによるアプリの拒否につながる可能性があるため、適切ではありません。
「ドメインごとの例外」アプローチの方がはるかに優れています。
[〜#〜] tls [〜#〜]のバージョンが1.2、TLS 1.0
ではないことを確認してください。
XCode8
で構築されたアプリは、SSL接続にTLS 1.2
を必要とします
私はiOS 9.3.1を使用しており、この問題が発生したときにhttpsを使用していました。シミュレーターでは問題なく動作しましたが、iPadでは失敗しました。その理由は、iPadでWiFiが有効になっており、会社のゲストネットワークに接続していたが、ネットワークに参加するためのポップアップWebサイトを受け取っていなかったためです。すべてを受け入れた後、再び正常に動作しました。