Hi,
I am using modem version 0.7.0-29 alpha modem firmware. ( I have also checked with 0.6.8-131 version )
I have already done MQTT connection with Azure IOT hub and it is working.
Now i want to do connection with our AWS IOT hub but getting error.
I have read few other threads of how to switch to our own AWS IOT hub and made changes to code but getting error.
I get error = -1 when below function is called inside "mqtt_client_tls_connect" function
ret = connect(client->transport.tls.sock, client->broker,
peer_addr_size);
I get "mqtt_connect: -111.
I have done following changes to certificates.h
#define NRF_CLOUD_CLIENT_ID "syght_device3" #define NRF_CLOUD_CLIENT_PRIVATE_KEY \ "-----BEGIN RSA PRIVATE KEY-----\n" \ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "-----END RSA PRIVATE KEY-----\n" #define NRF_CLOUD_CLIENT_PUBLIC_CERTIFICATE \ "-----BEGIN CERTIFICATE-----\n" \ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "-----END CERTIFICATE-----\n" #define NRF_CLOUD_CA_CERTIFICATE \ "-----BEGIN CERTIFICATE-----\n" \ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "-----END CERTIFICATE-----\n"
I made following change to connection function like below
mqtt_client_init(&azure_client); client_password.utf8 = NULL; client_password.size = 0; client_user_name.utf8 = (u8_t *)user_name; client_user_name.size = strlen(user_name); azure_client.broker = (struct sockaddr *)&azure_broker; azure_client.evt_cb = event_handler; azure_client.client_id.utf8 = (u8_t *)client_id; azure_client.client_id.size = strlen(client_id); azure_client.protocol_version = MQTT_VERSION_3_1_1; azure_client.password = NULL; azure_client.user_name = NULL; azure_client.transport.type = MQTT_TRANSPORT_SECURE; struct mqtt_sec_config *tls_config = &azure_client.transport.tls.config; memcpy(tls_config, &azure_tls_config, sizeof(struct mqtt_sec_config)); log("mqtt_connect is called\n");
Also If i use sec_tag used by Nordic then i can delete and write all certificates
But if i use sec_tag = 1600 then i am getting error 1 (NRF_EPERM) while writing second certificate and delete function gives error 2
following is my code to write and delete certificates
err = nrf_inbuilt_key_delete(sec_tag_list[0], 0); printk("nrf_inbuilt_key_delete(%lu, %d) => result=%d\r\n", sec_tag_list[0], 0, err); err = nrf_inbuilt_key_delete(sec_tag_list[0], 1); printk("nrf_inbuilt_key_delete(%lu, %d) => result=%d\r\n", sec_tag_list[0], 1, err); err = nrf_inbuilt_key_delete(sec_tag_list[0], 2); printk("nrf_inbuilt_key_delete(%lu, %d) => result=%d\r\n", sec_tag_list[0], 2, err); sec_tag = sec_tag_list[0]; buf_len = cert_buf_size; // sec_tag does not exist, write certificate err = nrf_inbuilt_key_write(sec_tag, NRF_KEY_MGMT_CRED_TYPE_CA_CHAIN, NRF_CLOUD_CA_CERTIFICATE, strlen(NRF_CLOUD_CA_CERTIFICATE)); if (!err) { log("sec_tag written: %d\n", (int)sec_tag); } // sec_tag does not exist, write certificate err = nrf_inbuilt_key_write(sec_tag, NRF_KEY_MGMT_CRED_TYPE_PRIVATE_CERT, NRF_CLOUD_CLIENT_PRIVATE_KEY, strlen(NRF_CLOUD_CLIENT_PRIVATE_KEY)); if (!err) { log("sec_tag written: %d\n", (int)sec_tag); } // sec_tag does not exist, write certificate err = nrf_inbuilt_key_write(sec_tag, NRF_KEY_MGMT_CRED_TYPE_PUBLIC_CERT, NRF_CLOUD_CLIENT_PUBLIC_CERTIFICATE, strlen(NRF_CLOUD_CLIENT_PUBLIC_CERTIFICATE)); if (!err) { log("sec_tag written: %d\n", (int)sec_tag); }
I have also assigned following in TLS configuration
azure_tls_config.peer_verify = 2; azure_tls_config.cipher_count = 0; azure_tls_config.cipher_list = NULL; azure_tls_config.sec_tag_count = ARRAY_SIZE(sec_tag_list); azure_tls_config.seg_tag_list = sec_tag_list; azure_tls_config.hostname = AWS_IOT_HUB_HOSTNAME;
I also like to know that there are 4 certificates generate on AWS IOT hub
1. Private key
2. Public key
3. CA certificate
4. Device certificate
In "type of credential" i can see only first 3 type so how to write fourth credential ?
Note: Variable name in above code is "azure" but it is AWS hub.
Regards,
Khodidas