System.Net.WebException: произошла ошибка SSL и невозможно установить безопасное соединение с сервером - PullRequest
0 голосов
/ 02 февраля 2019

Уже нашел ту же ветку здесь , но это не решило мою проблему.

Я добавил NSAppTransportSecurity и NSAllowsArbitraryLoads в info.plist.

Снимок экрана:

enter image description here

Добавлены следующие коды из этой статьи.

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>pm-admin.smartwcm.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowInsecureHTTPSLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
                <key>NSThirdPartyExceptionAllowInsecureHTTPSLoads</key>
                <false/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <true/>
                <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
                <key>NSRequiresCertificateTransparency</key>
                <false/>
            </dict>
        </dict>
    </dict>

Я использую HTTP REST API. При запуске проекта я получаю следующее исключение:

System.Net.WebException: произошла ошибка SSL и установлено безопасное соединениена сервер нельзя сделать.---> Foundation.NSErrorException: Error Domain = NSURLErrorDomain Code = -1200 «Произошла ошибка SSL, и безопасное соединение с сервером невозможно.»UserInfo = {NSLocalizedRecoverySuggestion = Вы все равно хотите подключиться к серверу?

Я что-то упустил или сделал что-то не так?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Причина: Начиная с iOS 9, iOS будет позволять вашему приложению обмениваться данными только с серверами, которые обеспечивают безопасность по умолчанию.Значения должны быть установлены в Info.plist для включения связи с небезопасными серверами. Кажется, что вы только AllowInsecureHTTPSLoads, но забыли добавить AllowsInsecureHTTPLoads

Решение: Добавьте следующий код в вашinfo.plist для доверия вашему домену.

<key>NSAppTransportSecurity</key>
 <dict>
 <key>NSExceptionDomains</key>
 <dict>
  <key>pm-admin.smartwcm.com</key>
  <dict>       
   <key>NSExceptionRequiresForwardSecrecy</key>
   <false/>
   <key>NSExceptionAllowsInsecureHTTPLoads</key>
   <true/>
   <key>NSIncludesSubdomains</key>
   <true/>
   ...... 
  </dict>
 </dict>

Вот аналогичная проблема , на которую вы можете ссылаться.

0 голосов
/ 02 февраля 2019

Потому что вы должны использовать сертификат.

class ViewController: UIViewController, URLSessionDelegate,URLSessionTaskDelegate {

var urlSession: Foundation.URLSession!

  override func viewDidLoad() {
        super.viewDidLoad()
        urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil)
}

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

        let serverTrust = challenge.protectionSpace.serverTrust
        let certificate = SecTrustGetCertificateAtIndex(serverTrust!, 0)
        let policies = NSMutableArray();
        policies.add(SecPolicyCreateSSL(true, (challenge.protectionSpace.host as CFString)))
        SecTrustSetPolicies(serverTrust!, policies);
        var result: SecTrustResultType = SecTrustResultType(rawValue: 0)!
        SecTrustEvaluate(serverTrust!, &result)
        let isServerTrusted:Bool = (result == SecTrustResultType.unspecified || result == SecTrustResultType.proceed)
        let remoteCertificateData:NSData = SecCertificateCopyData(certificate!)
        let pathToCert = Bundle.main.path(forResource: "certificateName", ofType: "crt")
        let localCertificate:NSData = NSData(contentsOfFile: pathToCert!)!
        let credential:URLCredential = URLCredential(trust: serverTrust!)
        completionHandler(.useCredential, credential)

    }


}
...