CFNetwork SSLHandshake failed iOS 9

后端 未结 11 1072
面向向阳花
面向向阳花 2020-11-22 09:38

has anyone with the iOS 9 beta 1 had this issue?

I use standard NSURLConnection to connect to a webservice and as soon as a call is made to the webservice i get th

相关标签:
11条回答
  • 2020-11-22 10:08

    The syntax for the Info.plist configuration

       <key>NSAppTransportSecurity</key>
       <dict>
       <key>NSExceptionDomains</key>
        <dict>
        <key>yourserver.com</key>
       <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
       </dict>
     </dict>
    

    0 讨论(0)
  • 2020-11-22 10:08

    The device I tested at had wrong time set. So when I tried accessing a page with a certificate that would run out soon it would deny access because the device though the certificate had expired. To fix, set proper time on the device!

    0 讨论(0)
  • 2020-11-22 10:14

    In iOS 10+, the TLS string MUST be of the form "TLSv1.0". It can't just be "1.0". (Sigh)


    The following combination of the other Answers works.

    Let's say you are trying to connect to a host (YOUR_HOST.COM) that only has TLS 1.0.

    Add these to your app's Info.plist

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>YOUR_HOST.COM</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>
    
    0 讨论(0)
  • 2020-11-22 10:14

    For more info Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11

    Curiously, you’ll notice that the connection attempts to change the http protocol to https to protect against mistakes in your code where you may have accidentally misconfigured the URL. In some cases, this might actually work, but it’s also confusing.

    This Shipping an App With App Transport Security covers some good debugging tips

    ATS Failure

    Most ATS failures will present as CFErrors with a code in the -9800 series. These are defined in the Security/SecureTransport.h header

    2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
    

    CFNETWORK_DIAGNOSTICS

    Set the environment variable CFNETWORK_DIAGNOSTICS to 1 in order to get more information on the console about the failure

    nscurl

    The tool will run through several different combinations of ATS exceptions, trying a secure connection to the given host under each ATS configuration and reporting the result.

    nscurl --ats-diagnostics https://example.com
    
    0 讨论(0)
  • 2020-11-22 10:16

    iOS 9 and OSX 10.11 require TLSv1.2 SSL for all hosts you plan to request data from unless you specify exception domains in your app's Info.plist file.

    The syntax for the Info.plist configuration looks like this:

    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSExceptionDomains</key>
      <dict>
        <key>yourserver.com</key>
        <dict>
          <!--Include to allow subdomains-->
          <key>NSIncludesSubdomains</key>
          <true/>
          <!--Include to allow insecure HTTP requests-->
          <key>NSExceptionAllowsInsecureHTTPLoads</key>
          <true/>
          <!--Include to specify minimum TLS version-->
          <key>NSExceptionMinimumTLSVersion</key>
          <string>TLSv1.1</string>
        </dict>
      </dict>
    </dict>
    

    If your application (a third-party web browser, for instance) needs to connect to arbitrary hosts, you can configure it like this:

    <key>NSAppTransportSecurity</key>
    <dict>
        <!--Connect to anything (this is probably BAD)-->
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

    If you're having to do this, it's probably best to update your servers to use TLSv1.2 and SSL, if they're not already doing so. This should be considered a temporary workaround.

    As of today, the prerelease documentation makes no mention of any of these configuration options in any specific way. Once it does, I'll update the answer to link to the relevant documentation.

    0 讨论(0)
  • 2020-11-22 10:16

    If your backend uses a secure connection ant you get using NSURLSession

    CFNetwork SSLHandshake failed (-9801)
    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
    

    you need to check your server configuration especially to get ATS version and SSL certificate Info:

    Instead of just Allowing Insecure Connection by setting NSExceptionAllowsInsecureHTTPLoads = YES , instead you need to Allow Lowered Security in case your server do not meet the min requirement (v1.2) for ATS (or better to fix server side).

    Allowing Lowered Security to a Single Server

    <key>NSExceptionDomains</key>
    <dict>
        <key>api.yourDomaine.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
    

    use openssl client to investigate certificate and get your server configuration using openssl client :

    openssl s_client  -connect api.yourDomaine.com:port //(you may need to specify port or  to try with https://... or www.)
    

    ..find at the end

    SSL-Session:
        Protocol  : TLSv1
        Cipher    : AES256-SHA
        Session-ID: //
        Session-ID-ctx: 
        Master-Key: //
        Key-Arg   : None
        Start Time: 1449693038
        Timeout   : 300 (sec)
        Verify return code: 0 (ok)
    

    App Transport Security (ATS) require Transport Layer Security (TLS) protocol version 1.2.

    Requirements for Connecting Using ATS:

    The requirements for a web service connection to use App Transport Security (ATS) involve the server, connection ciphers, and certificates, as follows:

    Certificates must be signed with one of the following types of keys:

    • Secure Hash Algorithm 2 (SHA-2) key with a digest length of at least 256 (that is, SHA-256 or greater)

    • Elliptic-Curve Cryptography (ECC) key with a size of at least 256 bits

    • Rivest-Shamir-Adleman (RSA) key with a length of at least 2048 bits An invalid certificate results in a hard failure and no connection.

    The following connection ciphers support forward secrecy (FS) and work with ATS:

    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

    Update: it turns out that openssl only provide the minimal protocol version Protocol : TLSv1 links

    0 讨论(0)
提交回复
热议问题