AWS SDK Embedded C配置mbedTLS+PKCS11连接IoT证书报错排查
问题背景
- 正在升级最新版AWS SDK for Embedded C,因设备仅支持OpenSSL 1.0.2版本,无法适配SDK自带的OpenSSL实现,因此选择在PKCS11上层使用mbedTLS作为TLS传输协议实现
- 实现过程中存在未理清的配置差异,导致功能异常:运行时始终提示证书无效,但所用证书均为合法有效证书,初步怀疑问题与
tlsCredentials.p11Session句柄的证书加载流程有关,存在遗漏的配置或加载步骤
核心实现代码
代码参考AWS官方Embedded C团队提供的示例编写,内容如下:
#define ALPN_PROTOCOL_NAME "\x0ex-amzn-mqtt-ca" const char * alpn[] = { ALPN_PROTOCOL_NAME, NULL }; MbedtlsPkcs11Status_t tlsStatus = MBEDTLS_PKCS11_SUCCESS; MbedtlsPkcs11Credentials_t tlsCredentials = { 0 }; const char * alpn[] = { ALPN_PROTOCOL_NAME, NULL }; /* Set the pParams member of the network context with desired transport. */ pNetworkContext->pParams = &tlsContext; /* Initialize credentials for establishing TLS session. */ tlsCredentials.pRootCaPath = rootCA; tlsCredentials.pClientCertLabel = clientCRT; tlsCredentials.pPrivateKeyLabel = clientKey; pkcs11ret = xInitializePkcs11Session( &tlsCredentials.p11Session ); if( pkcs11ret != CKR_OK ) { LogError( ( "Failed to initialize PKCS #11." ) ); } /* AWS IoT requires devices to send the Server Name Indication (SNI) * extension to the Transport Layer Security (TLS) protocol and provide * the complete endpoint address in the host_name field. */ tlsCredentials.disableSni = false; uint16_t port = AWS_IOT_MQTT_PORT; if( port == 443 ) { /* Pass the ALPN protocol name depending on the port being used. * ALPN protocol is required for AWS IoT MQTT endpoint accessed via port 443. */ tlsCredentials.pAlpnProtos = alpn; } bool status = false; if( pkcs11ret != CKR_OK ) { LE_ERROR( "Failed to initialize PKCS #11."); status = false; } else { printf( "===SUCCESSFULLY INITIALIZED PKCS #11.==="); // Insert the claim credentials into the PKCS #11 module status = loadClaimCredentials( tlsCredentials.p11Session, clientCRT, pkcs11configLABEL_CLAIM_CERTIFICATE, clientKey, pkcs11configLABEL_CLAIM_PRIVATE_KEY ); if( status == false ) { printf( "Failed to provision PKCS #11 with claim credentials." ); } else printf( "===SUCCESSFULLY PROVISIONED PKCS #11.==="); } /* Initialize reconnect attempts and interval */ BackoffAlgorithm_InitializeParams( &reconnectParams, CONNECTION_RETRY_BACKOFF_BASE_MS, CONNECTION_RETRY_MAX_BACKOFF_DELAY_MS, CONNECTION_RETRY_MAX_ATTEMPTS ); do { /* Establish a TLS session with the MQTT broker. This example connects * to the MQTT broker as specified in BROKER_ENDPOINT and BROKER_PORT at * the top of this file. */ LE_INFO("Establishing a TLS session to %.*s:%d.", BROKER_ENDPOINT_LENGTH, BROKER_ENDPOINT, AWS_IOT_MQTT_PORT ); tlsStatus = Mbedtls_Pkcs11_Connect( pNetworkContext, BROKER_ENDPOINT, port, &tlsCredentials, TRANSPORT_SEND_RECV_TIMEOUT_MS ); }
运行日志
运行时输出的日志信息如下:
mqttClientAws.c connectToServerWithBackoffRetries() 654 | ===SUCCESSFULLY INITIALIZED PKCS #11.=== mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:483] Successfully found object class attribute. mqttClientAws[5879] | [INFO] [PKCS11] [core_pkcs11_mbedtls.c:2823] Creating a 0x3 type object. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:2057] Successfully found the key type in the template. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:2086] Successfully found the label in the template. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:1259] Key was private type. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:1268] Received RSA key type. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:1288] Allocating a 1200 bytes sized buffer to write the key to. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_pal_utils.c:123] Converted Device Priv TLS Key to corePKCS11_Key.dat mqttClientAws[5879] | Successfully wrote 1192 to corePKCS11_Key.dat[DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:3352] Search parameters other than label are ignored. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:3446] Could not find the object handle in the list. Trying to search PKCS #11 PAL for object. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_pal_utils.c:123] Converted Device Cert to corePKCS11_Certificate.dat mqttClientAws[5879] | [INFO] [PKCS11] [core_pkcs11_pal.c:63] Could not open corePKCS11_Certificate.dat for reading. mqttClientAws[5879] | [ERROR] [PKCS11] [core_pkcs11.c:370] xFindObjectWithLabelAndClass ERROR CK_INVALID_HANDLE mqttClientAws[5879] | [INFO] [FLEET_PROVISIONING_DEMO] [pkcs11_operations.c:770] Writing certificate into label "Device Cert". mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:483] Successfully found object class attribute. mqttClientAws[5879] | [INFO] [PKCS11] [core_pkcs11_mbedtls.c:2823] Creating a 0x1 type object. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_pal_utils.c:123] Converted Device Cert to corePKCS11_Certificate.dat mqttClientAws[5879]/mqttClientAwsComponent T=main | mqttClientAws.c connectToServerWithBackoffRetries() 668 | ===SUCCESSFULLY PROVISIONED PKCS #11.=== mqttClientAws.c connectToServerWithBackoffRetries() 686 | Establishing a TLS session to axxxxxx-ats.iot.ap-southeast-2.amazonaws.com:443. mqttClientAws[5879] | Successfully wrote 861 to corePKCS11_Certificate.dat[DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:3352] Search parameters other than label are ignored. mqttClientAws[5879] | [DEBUG] [PKCS11] [core_pkcs11_mbedtls.c:3352] Search parameters other than label are ignored. mqttClientAws[5879] | [ERROR] [PKCS11] [core_pkcs11.c:370] xFindObjectWithLabelAndClass ERROR CK_INVALID_HANDLE mqttClientAws[5879] | [ERROR] [Transport_MbedTLS_PKCS11] [mbedtls_pkcs11_posix.c:625] Function returned ERROR. mqttClientAws[5879] | [ERROR] [Transport_MbedTLS_PKCS11] [mbedtls_pkcs11_posix.c:400] Failed to setup key handling by PKCS #11. mqttClientAws[5879] | [WARN] [DEMO] [mqttClientAws.c:724] Connection to the broker failed. Retrying connection after 270 ms backoff.
求相关排查思路与解决方案。
内容的提问来源于stack exchange,提问作者homer69
相关产品推荐
相关产品推荐

