菜鸟教程小白 发表于 2022-12-13 00:19:08

ios - 此服务器的证书对于 swift 3 上的自签名证书无效


                                            <p><p>我正在使用 swift 3 并第一次使用 Web 服务。我的 Web 服务通过 HTTPS 运行,我想使用适当的加密进行测试。</p>

<p>到目前为止,这是我的代码:</p>

<pre><code>    let config = URLSessionConfiguration.default // Session Configuration
    let session = URLSession(configuration: config) // Load configuration into Session
    let url = URL(string: webService.getLoginUrl())!

    let task = session.dataTask(with: url, completionHandler: {
      (data, response, error) in

      if error == nil {
            do {
                if let json =
                  try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? {
                  //Implement your logic
                  print(json)
                }
            } catch {
                print(&#34;error in JSONSerialization&#34;)
            }
      } else {
            print(error!.localizedDescription)
      }

    })
    task.resume()
</code></pre>

<p>当我对自签名的测试服务器运行此程序时,我得到:</p>

<pre><code>The certificate for this server is invalid. You might be connecting to a server that is pretending to be “10.0.0.51” which could put your confidential information at risk.
</code></pre>

<p>所以我想做的是在测试时接受所有证书,而不是在生产中。</p>

<p>我找到了几个网站,例如:</p>

<p> <a href="http://www.byteblocks.com/Post/Use-self-signed-SSL-certificate-in-iOS-application" rel="noreferrer noopener nofollow">http://www.byteblocks.com/Post/Use-self-signed-SSL-certificate-in-iOS-application</a>
<a href="https://github.com/socketio/socket.io-client-swift/issues/326" rel="noreferrer noopener nofollow">https://github.com/socketio/socket.io-client-swift/issues/326</a> </p>

<p>但这些似乎早于 swift 3。</p>

<p>我该如何解决这个问题?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>经过大量研究,我了解了代理如何在 swift 3 中使用 URLSession 对象。发布链接的部分太多,但最后,这是最有帮助的:<a href="https://gist.github.com/stinger/420107a71a02995c312036eb7919e9f9" rel="noreferrer noopener nofollow">https://gist.github.com/stinger/420107a71a02995c312036eb7919e9f9</a> </p>

<p>所以,为了解决这个问题,我从 URLSessionDelegate 继承了我的类,然后添加了以下函数:</p>

<pre><code>func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -&gt; Void) {

    //accept all certs when testing, perform default handling otherwise
    if webService.isTesting() {
      print(&#34;Accepting cert as always&#34;)
      completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }
    else {
      print(&#34;Using default handling&#34;)
      completionHandler(.performDefaultHandling, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }
}
</code></pre>

<p>isTesting() 调用确定我是否正在使用测试服务器,然后如果我们处于测试模式,我们将接受所有证书。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 此服务器的证书对于 swift 3 上的自签名证书无效,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/42939099/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/42939099/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 此服务器的证书对于 swift 3 上的自签名证书无效