代码之家  ›  专栏  ›  技术社区  ›  Travis Griggs

如何使用自签名证书为TLS创建iOS nwconnection?

  •  0
  • Travis Griggs  · 技术社区  · 5 年前

    我正在尝试为我的MQTT客户机使用Apple的新nwConnection类。对于测试,我需要能够创建一个到本地测试代理的TLS连接,它有一个自签名证书。

    到目前为止,我只是通过以下方式设置连接:

    self.connection = NWConnection(host: NWEndpoint.Host("172.16.202.172"), port: NWEndpoint.Port(integerLiteral: 8899), using: .tls)
    

    但是,当我连接时,我的控制台上会显示以下速度:

    2019-01-30 17:05:51.010580-0800 myAp[2591:608137] [] nw_socket_handle_socket_event [C4.1:1] Socket SO_ERROR [54: Connection reset by peer]
    2019-01-30 17:05:57.939157-0800 myApp[2591:608135] [BoringSSL] boringssl_context_alert_callback_handler(3724) [C5:1][0x103e087d0] Alert level: fatal, description: certificate unknown
    2019-01-30 17:05:57.939382-0800 myApp[2591:608135] [BoringSSL] boringssl_context_error_print(3676) boringssl ctx 0x282226af0: 4360838776:error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED:/BuildRoot/Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.230.1/ssl/handshake.cc:360:
    2019-01-30 17:05:57.939510-0800 myApp[2591:608135] [BoringSSL] boringssl_context_get_error_code(3560) [C5:1][0x103e087d0] SSL_AD_CERTIFICATE_UNKNOWN
    

    在过去,当我 URLSession.shared.dataTask 要从nginx https服务器下载文件,我将以下内容添加到info.plist中

    <dict>
        <key>App Transport Security Settings</key>
        <dict>
            <key>NSExceptionDomains</key>
            <dict>
                <key>172.16.202.172</key>
                <dict>
                    <key>NSIncludesSubdomains</key>
                    <true/>
                    <key>NSTemporaryExceptionsAllowsInsecureHTTPSLoads</key>
                    <true/>
                </dict>
            </dict>
        </dict>
    </dict>
    

    但在这种情况下,这似乎没有起到什么作用。当我点击苹果的文档链接 NWParameter 代替股票过关 .tls 我想我可以调整XLS设置,但苹果文档中没有任何信息。

    那么创建一个 NWConnection 对于使用自签名证书的TLS通信?

    1 回复  |  直到 5 年前
        1
  •  0
  •   Travis Griggs    5 年前

    我不确定这是否是完整/最佳答案,但我在苹果开发者论坛上发现了这种方法:

    func createTLSParameters(allowInsecure: Bool, queue: DispatchQueue) -> NWParameters {
        let options = NWProtocolTLS.Options()
        sec_protocol_options_set_verify_block(options.securityProtocolOptions, { (sec_protocol_metadata, sec_trust, sec_protocol_verify_complete) in
            let trust = sec_trust_copy_ref(sec_trust).takeRetainedValue()
            var error: CFError?
            if SecTrustEvaluateWithError(trust, &error) {
                sec_protocol_verify_complete(true)
            } else {
                if allowInsecure == true {
                    sec_protocol_verify_complete(true)
                } else {
                    sec_protocol_verify_complete(false)
                }
            }
        }, queue)
        return NWParameters(tls: options)
    }
    
    self.workQueue = DispatchQueue(label: "mqtt")
    self.connection = NWConnection(
        host: NWEndpoint.Host("172.16.202.172"),
        port: NWEndpoint.Port(integerLiteral: 8899),
        using: createTLSParameters(allowInsecure: true, queue: self.workQueue))
    

    使用这种技术,我根本不需要更改info.plist。

    有一些迹象表明,该论坛更倾向于将自签名证书以某种方式拉入您的iOS信箱。