Próbuję uzyskać tekst witryny na moim serwerze w SWIFT 5, który (moim zdaniem) ma prawidłowy certyfikat RSA SSL (zapłacony na moją subdomenę, nie jest podpisaną samodzielną), ale zawsze otrzymuję błąd 1202 " Certyfikat tego serwera jest nieprawidłowy ". Kiedy odwiedzam stronę internetową z Safari, nie ma problemu. Safari mówi, że certyfikat jest ważny.

public func createRequest(qMes: String, location: String, method: String , completionBlock: @escaping (String) -> Void) -> Void
  {

      let requestURL = URL(string: location)
      var request = URLRequest(url: requestURL!)

      request.httpMethod = method
      request.httpBody = qMes.data(using: .utf8)

      let requestTask = URLSession.shared.dataTask(with: request) {
          (data: Data?, response: URLResponse?, error: Error?) in

          if(error != nil) {
              print("Error: \(error)")
          }else
          {

            let outputStr  = String(data: data!, encoding: String.Encoding.utf8) as String?
              completionBlock(outputStr!);
          }
      }
      requestTask.resume()
  }

Funkcja jest używana w ten sposób:

    createRequest(qMes: "", location: "https://user:password@subdomain.server.com:3452/index.php", method: "GET") { (output) in
        print(output)
    }

Dodałem to do moich informacji.plist

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>server.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsLocalNetworking</key>
        <true/>
    </dict>

Ponieważ aplikacja jest tylko do użytku prywatnego, nie ma znaczenia, czy wystąpi problem z weryfikacją certyfikatu, więc chcę obejść ten błąd w jakiś błąd.

Czytałem w wielu stanowiskach, że nie wystarczy zmodyfikować Info.plist, aby wyłączyć weryfikację certyfikatu, ale po próbie zmodyfikowania mojego kodu przez 10 ciężkich godzin, rezygnuję, ponieważ jestem absolutnym początkującym w Swift i nie didn "Bądź uruchomiony.

Dziwny fakt: Podczas prowadzenia tego kodu w mojej niezależnej aplikacji ze Watchos (sam zegarka, w symulatorze), nie powiedzie się z powodu weryfikacji certyfikatu, ale podczas prowadzenia tego samego kodu na placu zabaw, nie ma problemu.

Próbowałem też z Alamofire 5, ten sam wynik.

Czy ktoś może mi pomóc i zmodyfikować mój kod?

4
Chris 26 grudzień 2019, 06:27

1 odpowiedź

Najlepsza odpowiedź

Jeśli naprawdę chcesz zignorować certyfikat SSL, który mógłbyś, na przykład, zignoruj go za pomocą metody odsłoniętej przez {x0}} w następujący sposób:

extension YOURVIEWCONTROLLER: URLSessionDelegate {
    public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
       //Trust the certificate even if not valid 
       let urlCredential = URLCredential(trust: challenge.protectionSpace.serverTrust!)

       completionHandler(.useCredential, urlCredential)
    }
}

Pamiętaj, aby ustawić delegat do self, gdy utworzysz URLSession w kodzie. Na przykład możesz go ustawić za pomocą tego:

let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil)

Mam nadzieję, że to pomoże

7
Josh Correia 3 czerwiec 2020, 04:42