はじめに
iPhoneと家庭内で使っているIoT機器とのTLSを使った暗号通信する時に、サーバ証明書の有効性の確認が失敗して、通信エラーになる現象がありました。例えば、IoT機器が自己署名の証明書を使っている場合です。このような場合に、iOSでTLS証明書を無視して通信する方法を書いておきます。
通常の実装
NWConnection
を用いた通常のTLS実装は、以下のようになります。今回の記事に関連する部分(NWConnection
のインスタンス化)のみ記載しています。この実装では、サーバ証明書の確認を行います。このため、IoT機器が自己署名の証明書を使っている場合には、サーバ証明書のエラーとなりIoT機器と通信ができません。
let connection = NWConnection(host: host, port: port, using: .tls)
サーバ証明書を無視する実装
以下のように、NWConnection
のパラメータ(using: params
)を設定することで、サーバ証明書を無視することができます。sec_protocol_options_set_verify_block()
でsec_protocol_verify_complete(true)
を設定します。この時に、connection.start(queue: queue)
で使うqueue
が引数に必要です。このため、対象のコードの上下にqueue
に関するコードも記載してあります。
let queue = DispatchQueue(label: "label")
let options = NWProtocolTLS.Options()
sec_protocol_options_set_verify_block(options.securityProtocolOptions, { (_, _, sec_protocol_verify_complete) in
sec_protocol_verify_complete(true)
}, queue)
let params = NWParameters(tls: options)
let connection = NWConnection(host: host, port: port, using: params)
// 途中省略
connection.start(queue: queue)