当前位置: 首页 > 知识库问答 >
问题:

带有PSK的mbedtls导致错误

欧镜
2023-03-14

我正在尝试将PSK与mbedtls库与SGX结合使用。没有PSK,连接工作正常。

以下是相关的客户端代码

mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_ssl_context ssl;
mbedtls_ssl_config conf;
mbedtls_x509_crt cacert;

mbedtls_net_init(&server_fd);
mbedtls_ssl_init(&ssl);
mbedtls_ssl_config_init(&conf);
mbedtls_x509_crt_init(&cacert);
mbedtls_ctr_drbg_init(&ctr_drbg);


mbedtls_entropy_init( &entropy );
if ((mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char*) pers, strlen(pers))) != 0) {
    mbedtls_printf( " failed\n  ! mbedtls_ctr_drbg_seed returned %d\n", ret );
    ret = -1;
    break;
}

ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *) mbedtls_crt, mbedtls_crt_len);

if ((ret = mbedtls_net_connect(&server_fd, SERVER_NAME, SERVER_PORT, MBEDTLS_NET_PROTO_TCP )) != 0) {
    mbedtls_printf( " failed\n  ! mbedtls_net_connect returned %d\n\n", ret );
    break;
}

if ((ret = mbedtls_ssl_config_defaults(&conf,
                                       MBEDTLS_SSL_IS_CLIENT,
                                       MBEDTLS_SSL_TRANSPORT_STREAM,
                                       MBEDTLS_SSL_PRESET_DEFAULT)) != 0 )
{
    mbedtls_printf( " failed\n  ! mbedtls_ssl_config_defaults returned %d\n\n", ret );
    break;
}

mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL );
mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );
mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
mbedtls_ssl_conf_dbg( &conf, my_debug, NULL );
mbedtls_ssl_conf_verify( &conf, my_verify, NULL );

const unsigned char psk_key[] = {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
};
size_t psk_len = sizeof( psk_key );
const char psk_id[] = "Client_identity";

if ((ret = mbedtls_ssl_conf_psk(&conf, psk_key, psk_len,
                                (const unsigned char *) psk_id,
                                strlen(psk_id))) != 0 )
{
    mbedtls_printf( "  mbedtls_ssl_conf_psk returned %d\n\n", ret );
    break;
}



if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )
{
    mbedtls_printf( " failed\n  ! mbedtls_ssl_setup returned %d\n\n", ret );
    break;
}

if( ( ret = mbedtls_ssl_set_hostname( &ssl, "mbed TLS Server 1" ) ) != 0 )
{
    mbedtls_printf( " failed\n  ! mbedtls_ssl_set_hostname returned %d\n\n", ret );
    break;
}

mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );

mbedtls_printf( " ok\n" );
mbedtls_printf( "  . Performing the SSL/TLS handshake..." );

while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
    if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
        mbedtls_printf( " failed\n  ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret);
        break;
    }
}


....

我有openssl测试服务器运行:

 openssl s_server -accept 4433 -cert server.pem -psk 000102030405060708090a0b0c0d0e0f -psk_hint Client_identity -cipher PSK-AES256-CBC-SHA -debug

服务器接收连接并交换PSK消息,但是在解密点我收到以下错误:

 error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac:s3_pkt.c:532: 

我还尝试将-密码PSK-AES256-CBC-SHA更改为不同的密码,但仍然是相同的错误。当完全省略密码时,连接正常,但没有执行PSK!?

共有1个答案

松洛华
2023-03-14

经过几次尝试,我设法找到了这个问题的根本原因。失败的原因,从openssls_server日志中的以下日志中可以看出(我使用了-debug-tlsextdebug):

创建PSK len=15

它源自openssl代码但是,您使用的密钥是16个字节。当我将psk更改为“010102030405060708090a0b0c0d0e0f”时,TLS连接正常工作,日志如下:

创造了PSK len=16

我相信这种失败的根本原因是在OPENSSL_hexstr2buf()实现中,它忽略了最重要的零,从而返回了密钥的错误长度。

 类似资料:
  • 我试图用SpringSecurity5实现一个oauth2安全的SpringBootAPI。我希望API是一个oauth2资源服务器,并且能够使用WebClient访问外部oauth2资源服务器,并授予客户端凭据。 我可以将API配置为oauth2资源服务器或oauth2客户机,但不能同时配置两者。 下面是将API配置为具有Spring Security性5的资源服务器的最小设置。我使用不透明令牌

  • 问题内容: 我正在尝试在NodeJS中使用async / await,但是我的脚本抛出了语法错误。 自从Node 7.6以来,我一直很自然地支持 async / await 。当我跑步时我得到。 以下是内容: 但是,当我调用此脚本时,我得到: 我正在运行Linux Mint 18.1。 如何获得我的脚本进行编译和运行? 问题答案: 仅在内部函数中有效,因此,例如,您需要一个异步IIFE将代码包装为

  • 当我移除Android:BackgroundTint标记时,错误就消失了。知道为什么会这样吗?

  • 原名 PolarSSL ,也许是最小巧的ssl代码库。高效、便于移植和集成。尤其适合嵌入式应用。 目前 PolarSSL 已经被 ARM 公司收购,并改名为 mbed TLS。许可证也由 GPL 改为 Apache。

  • 问题内容: 有谁知道为什么以下代码无法编译?add()和addAll()均无法按预期工作。删除“?extends”部分可以使所有工作正常,但是我将无法添加Foo的子类。 错误1: IntelliJ说: 编译器说: 错误2: IntelliJ给我 而编译器只是说 问题答案: (我在这里假设和都是的子类型。) 表示 某种类型的元素的列表,这是Foo的子类型,但我们不知道哪种类型 。此类列表的示例为a