首页 > 解决方案 > 如何设置 WolfSSL 密码列表?

问题描述

我有一个IOTDTLS 1.2 protocol. 我们已经将 WolfSSL 集成到我们的项目中,并且运行良好。我想要实现的是只为我设置一个特定的密码套件,WolfSSL client以便我确保它使用正确的加密方法。

const char *CIPHER_LIST = "PSK-AES128-CCM-8";
WOLFSSL_CTX *ctx = wolfSSL_CTX_new(wolfDTLSv1_2_client_method());
wolfSSL_CTX_set_cipher_list(ctx, CIPHER_LIST);

WOLFSSL *ssl = wolfSSL_new(ctx)
wolfSSL_set_cipher_list(ssl, CIPHER_LIST);

当我打印密码列表时;

for (int i = 0; i< 50; i++) {
    // print cipher list based on priority
    NSLog(@"->%s", wolfSSL_get_cipher_list(i));
}

结果将是

DHE-RSA-AES128-SHA
DHE-RSA-AES256-SHA
DHE-PSK-AES256-GCM-SHA384
DHE-PSK-AES128-GCM-SHA256
PSK-AES256-GCM-SHA384
PSK-AES128-GCM-SHA256
DHE-PSK-AES256-CBC-SHA384
DHE-PSK-AES128-CBC-SHA256
PSK-AES256-CBC-SHA384
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA
PSK-AES256-CBC-SHA
DHE-PSK-AES128-CCM
DHE-PSK-AES256-CCM
PSK-AES128-CCM
PSK-AES256-CCM
PSK-AES128-CCM-8
PSK-AES256-CCM-8
DHE-RSA-AES128-SHA256
DHE-RSA-AES256-SHA256
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
EDH-RSA-DES-CBC3-SHA

如果我打电话wolfSSL_get_cipher(ssl),我会得到结果“NONE”。

在更新我们的 IOT 设备固件之前,该库一直运行良好,然后我们开始没有收到任何响应。在我回溯响应失败后,我意识到这是一个 SSL 握手问题,我决定设置一个密码列表。我想知道,我有什么遗漏或做错了吗?

此外,我们还有一个 Android 应用程序,它使用“PSK-AES128-CCM-8”加密方法与同一设备通信。这就是为什么我只想设置我的列表这个特定的方法。

此外,这是WolfSSL的 user_settings.h;

/* Configuration */
#define IPHONE  /* Needed for Xcode */
#define DEBUG_WOLFSSL

#define HAVE_HASHDRBG
#define HAVE_AESGCM
#define HAVE_AESCCM

#define WOLFSSL_SHA512
#define WOLFSSL_SHA384
#define WOLFSSL_STATIC_PSK
#define WOLFSSL_DTLS

#define NO_WOLFSSL_SERVER

#ifdef HAVE_FIPS
#define NO_MD4
#define NO_HC128
#define NO_RABBIT
#define NO_DSA
#define NO_PWDBASED
#else
#define USE_FAST_MATH
#endif

标签: ioscencryptionwolfssl

解决方案


@efdalustaoglu,

得知设备固件更新导致此失败,我深感遗憾。让我看看我是否可以令人满意地解决未知或意外的项目,然后提出一种有助于更快解决此问题的方法:

1)

当我打印密码列表时;

for (int i = 0; i< 50; i++) {
    // print cipher list based on priority
    NSLog(@"->%s", wolfSSL_get_cipher_list(i));
}

...

函数 wolfSSL_get_cipher_list 获取所有可用密码的列表,它不会只返回专门设置的密码,这就是为什么您会看到整个列表打印出来的原因。

2)

如果我调用 wolfSSL_get_cipher(ssl) 我得到结果“NONE”。

这将返回在握手期间选择的密码套件。如果在握手成功后调用它(IE:ret = wolfSSL_connect(ssl); ret 是 WOLFSSL_SUCCESS),您将看到在握手期间协商了哪个密码套件。

3)最后,从我所见,您并没有做错任何事,事实上,这是朝着以预期方式失败的可重复设置迈出的良好第一步。(IE 仅限于一个密码套件)。


可帮助快速解决的步骤:

1)调试:

你能分享你看到的错误代码(如果有的话)吗?我看到您已经将 DEBUG_WOLFSSL 添加到您的设置中,您现在可以调用wolfSSL_Debugging_ON();您的应用程序来生成调试日志。你能分享一下吗?

2) 线鲨:

捕获失败的连接通常可以提供关于失败原因的非常有用的线索。查看握手失败的时间点对于诊断原因也非常有利。

此外,我们还有一个 Android 应用程序,它使用“PSK-AES128-CCM-8”加密方法与同一设备通信。这就是为什么我只想设置我的列表这个特定的方法。

这是极好的!如果您可以从 android 设备捕获成功的连接并将该捕获与失败的连接进行比较,我们可以比较客户端 Hello 和服务器响应数据包中的差异。

3) 作为最后的手段,如果您不能快速缩小范围,您可以随时通过官方支持渠道联系我们的 wolfSSL 支持团队,方法是发送电子邮件至 [support (at) wolfssl (dot) com] 或访问我们的 zendesk [wolfssl (dot) zendesk (dot) com] 的门户。我们的团队总是乐于以任何方式提供帮助。


推荐阅读