Как подключить сервер MQTT с использованием файла SSL-сертификата .crt?

#ios #swift #ssl-certificate #mqtt

#iOS #swift #ssl-сертификат #mqtt

Вопрос:

У меня есть m2mqtt_srv.crt файл SSL-сертификата. Я использую CocoaMQTT библиотеку. Я хочу подключить свой сервер MQTT к порту 8883.

Ниже приведен мой проверенный код.

 import UIKit
import CocoaMQTT

class ViewController: UIViewController, CocoaMQTTDelegate {

@IBOutlet var statusLabel: UILabel!

var mqtt: CocoaMQTT?

override func viewDidLoad() {
    super.viewDidLoad()
           
    selfSignedSSLSetting()
    
    let a = mqtt?.connect()
    print(a as Any)
    
    print(mqtt?.connState as Any)
}

func selfSignedSSLSetting() {
    let clientID = "AWS"
    let defaultHost = "18.159.54.124"

    mqtt = CocoaMQTT(clientID: clientID, host: defaultHost, port: 8883)
    mqtt!.username = ""
    mqtt!.password = ""
    mqtt!.keepAlive = 60
    mqtt!.delegate = self
    mqtt!.enableSSL = true
    mqtt!.allowUntrustCACertificate = true
    
    let clientCertArray = getClientCertFromP12File(certName: "m2mqtt_srv", certPassword: "MySecretPassword")
    
    var sslSettings: [String: NSObject] = [:]
    sslSettings[kCFStreamSSLCertificates as String] = clientCertArray
    
    mqtt!.sslSettings = sslSettings
}

func mqtt(_ mqtt: CocoaMQTT, didStateChangeTo state: CocoaMQTTConnState) {
    statusLabel.text = state.description
}

func mqtt(_ mqtt: CocoaMQTT, didConnectAck ack: CocoaMQTTConnAck) {
    print(ack)
}

func mqtt(_ mqtt: CocoaMQTT, didPublishMessage message: CocoaMQTTMessage, id: UInt16) {
    print(message)
}

func mqtt(_ mqtt: CocoaMQTT, didPublishAck id: UInt16) {
    print(id)
}

func mqtt(_ mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16) {
    print(message)
}

func mqtt(_ mqtt: CocoaMQTT, didSubscribeTopic topics: [String]) {
    print(topics)
}

func mqtt(_ mqtt: CocoaMQTT, didUnsubscribeTopic topic: String) {
    print(topic)
}

func mqttDidPing(_ mqtt: CocoaMQTT) {
    print(mqtt)
    print("Status: (mqtt.connState)")
}

func mqttDidReceivePong(_ mqtt: CocoaMQTT) {
    print(mqtt)
}

func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: Error?) {
    print(err as Any)
    statusLabel.text = err?.localizedDescription
}
    
func getClientCertFromP12File(certName: String, certPassword: String) -> CFArray? {
    // get p12 file path
    let resourcePath = Bundle.main.path(forResource: certName, ofType: "crt")
    
    guard let filePath = resourcePath, let p12Data = NSData(contentsOfFile: filePath) else {
        print("Failed to open the certificate file: (certName).crt")
        return nil
    }
    
    // create key dictionary for reading p12 file
    let key = kSecImportExportPassphrase as String
    let options : NSDictionary = [key: certPassword]
    
    var items : CFArray?
    let securityError = SecPKCS12Import(p12Data, options, amp;items)
    
    guard securityError == errSecSuccess else {
        if securityError == errSecAuthFailed {
            print("ERROR: SecPKCS12Import returned errSecAuthFailed. Incorrect password?")
        } else {
            print("Failed to open the certificate file: (certName).crt")
        }
        return nil
    }
    
    guard let theArray = items, CFArrayGetCount(theArray) > 0 else {
        return nil
    }
    
    let dictionary = (theArray as NSArray).object(at: 0)
    guard let identity = (dictionary as AnyObject).value(forKey: kSecImportItemIdentity as String) else {
        return nil
    }
    let certArray = [identity] as CFArray
    
    return certArray
}
}
 

Не могли бы вы сообщить мне, как мне подключиться к серверу MQTT с использованием m2mqtt_srv.crt этого сертификата?

Или

Должен ли я использовать SSL-сертификат m2mqtt_srv.crt или что-то с расширением .файл p12, который я должен использовать?

Я понятия не имею, как это сделать?

Комментарии:

1. sslSettings Свойство должно содержать ключ kCFStreamSSLCertificates со значением, представляющим собой массив. Первым элементом этого массива должен быть SecIdentityRef для вашего клиентского сертификата и закрытого ключа См. developer.apple.com/documentation/security /…

2. Используя приведенный выше код, я не могу сгенерировать «clientCertArray» для sslSettings.

3. Вы не сказали, что не работает с опубликованным вами кодом. Отредактируйте вопрос, чтобы четко указать, что не работает.

4. @hardillb Когда я запускаю это, я получаю «SecurityError» = 26275. И не удалось открыть файл сертификата: сообщение m2mqtt_srv.crt в cansole.

5. @hardillb Я хочу, чтобы certArray из getClientCertFromP12File(certName: String, certPassword: String) выполнял эту функцию.