如何设置WolfSSL密码列表?

时间:2019-05-09 08:30:15

标签: ios c encryption wolfssl

我有一个与IOT通信的DTLS 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

1 个答案:

答案 0 :(得分:1)

@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”。

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

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


可以帮助您快速解决的步骤:

1)调试:

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

2)Wireshark:

捕获失败的连接通常可以提供有关失败原因的非常有用的线索。找出握手失败的那一点在诊断原因方面也非常有利。

  

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

那太好了!如果您可以从android设备捕获成功的连接并将该捕获与失败的连接进行比较,我们可以比较“客户端问候”和“服务器响应”数据包中的区别。

3)作为万不得已的方法,如果您不能迅速缩小范围,可以随时通过官方支持渠道与我们的wolfSSL支持团队联系,方法是发送电子邮件至[support(at)wolfssl(dot)com]或在[wolfssl(dot)zendesk(dot)com]上访问我们的zendesk门户。我们的团队总是很乐意尽我们所能提供帮助。