首页 > 解决方案 > SocketIOClient:处理事件:数据错误:[“无效的 SSL 证书”]

问题描述

问题是关于 Invalid 的SSL Certificate。我一直在尝试连接到Websocket使用SocketIOClient. 但是遇到无效的 SSL 证书问题。用于连接 Socket 的代码是

import UIKit
import SocketIO
class SocketIOManager: NSObject, URLSessionDelegate {

    static let shared = SocketIOManager()
    var socket: SocketIOClient!

    func socketConnect() {

        let token = "ggggggg" //some token
        let url  = URL(string: "https://sample.com") // some https url
        let specs: SocketIOClientConfiguration = [
            .connectParams(["access_token": token]),
            .log(true),
            .forceNew(true),
            .selfSigned(true),
            .forcePolling(true),
            .secure(true),
            .reconnects(true),
            .forceWebsockets(true),
            .reconnectAttempts(3),
            .reconnectWait(3),
            .security(SSLSecurity(usePublicKeys: true)),
            .sessionDelegate(self),
            ]
        socket = SocketIOClient(socketURL: url!, config: specs)

        socket.on(clientEvent: .connect) {data, ack in
            print("socket connected")
            self.socket.emitWithAck("emit", with: []).timingOut(after: 2, callback: { (data) in
                print(data)
            })
        }

        socket.on("fetch") { (dataArray, ack) in
            print(dataArray)
        }

        socket.on(clientEvent: .error) {data, ack in
            print(data)
        }

        socket.on(clientEvent: .disconnect) {data, ack in
            print(data)
        }

        socket.onAny { (data) in
            // print(data)
        }

        socket.connect()

    }

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

        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }

    func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {
        // We've got an error
        if let err = error {
            print("Error: \(err.localizedDescription)")
        } else {
            print("Error. Giving up")
        }
    }

}

标签: swiftsslwebsocketsocket.iossl-certificate

解决方案


有两种可能的解决方案

解决方案1:

只需在主包中添加所需的 ssl 证书(.cer 文件)。而已!!

解决方案2:

*如果您不需要自签名和 SSL Pining,请修改您的代码规范,如下面的代码。

let specs: SocketIOClientConfiguration = [
        .connectParams(["access_token": token]),
        .log(true),
        .forceNew(true),
        .forcePolling(true),
        .reconnects(true),
        .forceWebsockets(true),
        .reconnectAttempts(3),
        .reconnectWait(3),
        .sessionDelegate(self),
        ]

推荐阅读