CoAP Secure use x509 Certificate

I execute CoAP Secure connect use "x509 Certificate" always disconnect,
But CoAP Secure connect use psk is success.
where did I get wrong in CoAP Secure Initial use x509 Certificate

Env: nRF52840, nrfconnect 2.1.0, zephyr

X509 Certificate data From /opt/nordic/ncs/v2.1.0/Modules/lib/openthread/src/cli/x509_cert_key.hpp

Server CoAP Secure Initial code:

# if IS_ENABLED(CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
// USE PSK
    otCoapSecureSetPsk( srv_context.ot, "123", sizeof("123"), "mypskid", sizeof("mypskid") );
    otCoapSecureSetSslAuthMode( srv_context.ot, true );
    
    otCoapSecureSetDefaultHandler( srv_context.ot, coap_default_handler, NULL );
    otCoapSecureAddResource( srv_context.ot, &light_resource );
    otCoapSecureAddResource( srv_context.ot, &provisioning_resource );

    error = otCoapSecureStart( srv_context.ot, OT_DEFAULT_COAP_SECURE_PORT );
    if (error != OT_ERROR_NONE) {
        LOG_ERR("Failed to start OT CoAP Secure PSK. Error: %d", error);
        goto end;
    }

# else
// USE X509
    otCoapSecureSetCertificate( srv_context.ot, 
        MY_OT_CLI_COAPS_X509_CERT, sizeof(MY_OT_CLI_COAPS_X509_CERT),
        MY_OT_CLI_COAPS_PRIV_KEY, sizeof(MY_OT_CLI_COAPS_PRIV_KEY) );

    otCoapSecureSetCaCertificateChain( srv_context.ot,
        MY_OT_CLI_COAPS_TRUSTED_ROOT_CERTIFICATE,
        sizeof(MY_OT_CLI_COAPS_TRUSTED_ROOT_CERTIFICATE) );
    
    
    otCoapSecureSetSslAuthMode( srv_context.ot, true );
    
    otCoapSecureSetDefaultHandler( srv_context.ot, coap_default_handler, NULL );
    otCoapSecureAddResource( srv_context.ot, &light_resource );
    otCoapSecureAddResource( srv_context.ot, &provisioning_resource );

    error = otCoapSecureStart( srv_context.ot, OT_DEFAULT_COAP_SECURE_PORT );
    if (error != OT_ERROR_NONE) {
        LOG_ERR("Failed to start OT CoAP Secure X509. Error: %d", error);
        goto end;
    }

# endif // end of IS_ENABLED(CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)

Client CoAP Secure Initial code:

# if IS_ENABLED(CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
// USE PSK
    otCoapSecureSetPsk( m_otIntance, "123", sizeof("123"), "mypskid", sizeof("mypskid") );
    otCoapSecureSetSslAuthMode( m_otIntance, true );
    
    error = otCoapSecureStart( m_otIntance, OT_DEFAULT_COAP_SECURE_PORT );
    if (error != OT_ERROR_NONE) {
        LOG_ERR("Failed to start OT CoAP Secure PSK. Error: %d", error);
        return;
    }

# else
// USE X509
    otCoapSecureSetCertificate( m_otIntance, 
        MY_OT_CLI_COAPS_X509_CERT, sizeof(MY_OT_CLI_COAPS_X509_CERT),
        MY_OT_CLI_COAPS_PRIV_KEY, sizeof(MY_OT_CLI_COAPS_PRIV_KEY) );

    otCoapSecureSetCaCertificateChain( m_otIntance,
        MY_OT_CLI_COAPS_TRUSTED_ROOT_CERTIFICATE,
        sizeof(MY_OT_CLI_COAPS_TRUSTED_ROOT_CERTIFICATE) );

    otCoapSecureSetSslAuthMode( m_otIntance, true );

    error = otCoapSecureStart( m_otIntance, OT_DEFAULT_COAP_SECURE_PORT );
    if (error != OT_ERROR_NONE) {
        LOG_ERR("Failed to start OT CoAP Secure X509. Error: %d", error);
        return;
    }

# endif // end of IS_ENABLED(CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)

Client CoAP Secure connect:

void CoapsHandleConnected(bool aConnected, void *aContext)
{
    if(aConnected) {
        LOG_INF("Connected");
    }
    else {
        LOG_INF("Disconnect");
    }
}


static void send_provisioning_request(struct k_work *item)
{
    ARG_UNUSED(item);
    
    // CoAP Secure
    if( !otCoapSecureIsConnectionActive( m_otIntance ) ) {
        otError error;
        otSockAddr sockAddr;
        error = otIp6AddressFromString( "fdde:ad00:beef:0:b636:5398:5f11:85c4", &sockAddr.mAddress );
        if( error != OT_ERROR_NONE ) {
            LOG_INF("otIp6AddressFromString error.");
            return;
        }
        sockAddr.mPort = OT_DEFAULT_COAP_SECURE_PORT;
        otCoapSecureConnect( m_otIntance, &sockAddr, CoapsHandleConnected, NULL );
    }
    else {
        otCoapSecureDisconnect( m_otIntance );
    }

}

  • Hi, 

    I am looking into this case and would reply later. 

    Regards,
    Amanda H.

  • Hi, 

    The original error is a tls handshake failure caused by selection of incorrect ciphersuite by the server (MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 instead of MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8).

    It's possible to make x509 usable by disabling ECJPAKE ciphersuite (CONFIG_MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED=n) and raising mbedtls heap size (CONFIG_MBEDTLS_HEAP_SIZE=15200) - disabling ECJPAKE will result in openthread compilation error, as some files stop being included, which results in undeclared symbols. This can be solved by #ifdef guarding erroneous lines.

    This, however, is a workaround - openthread relies on ECJPAKE for some functionalities (like commissioning). Those functionalities will fail after disabling the ciphersuite.

    Will update once a proper fix is found.

    -Amanda H.

Related