Как выполнить небезопасный запрос URLSession в iOS - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь выполнить запрос к веб-сайту, который я запускаю. Однако в настоящее время сертификат этого веб-сайта недействителен (по уважительной причине на данный момент).

Я пытаюсь запросить его с помощью этого кода:

private static func performQuery(_ urlString: String) {
    guard let url = URL(string: urlString) else {
        return
    }
    print(url)
    URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        if error != nil {
            print(error!.localizedDescription)
        }
        guard let data = data else {
            return
        }
        do {
            let productDetails = try JSONDecoder().decode([ProductDetails].self, from: data)
            DispatchQueue.main.async {
                print(productDetails)
            }
        } catch let jsonError {
            print(jsonError)
        }
    }.resume()
}

Однако я получаю:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
The certificate for this server is invalid. You might be connecting to a server that is pretending to be “mydomain.com” which could put your confidential information at risk.

Как сделать небезопасный запрос URLSession (эквивалентно -k в CURL)?

Я пытался установить эти:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

И да, я не собираюсь выпускать это в App Store с небезопасным доступом, но мне нужно протестировать код, и сейчас мы не можем получить действительный сертификат, так что это чисто для целей разработки.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Сначала установите делегат сеанса для вашего класса, который соответствует URLSessionDelegate, например:

let session = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue.main)

Добавьте реализацию класса didReceiveChallenge в вашем классе, которая соответствует протоколу URLSessionDelegate

public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}

Это разрешит небезопасное соединение, доверяя серверу.

ПРЕДУПРЕЖДЕНИЕ : НЕ используйте этот код в производственных приложениях, это потенциальная угроза безопасности.

0 голосов
/ 02 июля 2018

Попробуйте следующие исключения:

<key>NSExceptionMinimumTLSVersion</key>
  <string>TLSv1.0</string>
  <key>NSExceptionRequiresForwardSecrecy</key>
  <false/>
  <key>NSExceptionAllowsInsecureHTTPLoads</key>
  <true/>
  <key>NSIncludesSubdomains</key>
<true/>
...