《密码技术与物联网安全:mbedtls开发实战》 —2.4.2 遍历 mbedtls 安全套件
2.4.2 遍历 mbedtls 安全套件
虽然Base64示例相对简单,但是已经展现了使用mbedtls构建应用的基本步骤。经过一个简单的示例之后,我们适当提高难度实现一个更为复杂的示例,在这个示例中将遍历mbedtls所支持的安全套件。mbedtls支持很多常用的安全套件,但对于物联网嵌入式终端来说,过多的安全套件将会占用更多的资源,另外有些安全套件由于种种历史原因也不会在物联网领域流行。mbedtls可通过配置文件裁剪一些不必要的安全套件,这样可大大缩小mbedtls所占用的代码空间。在mbedtls中可通过mbedtls_ssl_list_ciphersuites函数遍历所有用于TLS/DTLS通信的安全套件。
例如,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384安全套件如图2-2所示。该密码套件具体含义如下:
密钥协商算法 ECDHE
身份认证算法 ECDSA
对称加密算法 AES_256
消息认证算法 GCM
伪随机数算法SHA384
图2-2 安全套件名称构成方式
虽然安全套件名称不能表示所有参数,但是可以指示其中的重要参数。当前已经有超过300种安全套件被官方定义,可访问IANA的TLS官方页面获得完整列表。
1.示例代码
遍历mbedtls安全套件的代码,如代码清单2-4所示。
代码清单2-4 遍历mbedtls安全套件示例
#include <stdio.h>
#include "mbedtls/ssl.h"
int main( void )
{
int index = 1;
const int *list;
const char *name;
mbedtls_printf("\n Available Ciphersuite:\n\n");
list = mbedtls_ssl_list_ciphersuites();①
for(; *list; list++) {
name = mbedtls_ssl_get_ciphersuite_name(*list);②
mbedtls_printf(" [%03d] %s\n", index++, name);
}
mbedtls_printf("\n");
return 0;
}
1)mbedtls_ssl_list_ciphersuites将返回全局数组supported_ciphersuites,该数组定义了所有被mbedtls支持的安全套件;
2)获得安全套件名称,例如TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384或TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384。
2.编写 CMakeLists.txt
为了在Linux平台上构建一个可执行程序,还需要编写一个CMakeLists.txt文件,这个CMakeLists.txt构建文件与上一个Base64示例的构建文件非常相似,只是可执行文件名称和依赖C文件名称发生了变化,具体内容如代码清单2-5所示。
代码清单2-5 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.8.2)①
project("Ciphersuite-list")②
include_directories(./ $ENV{MBEDTLS_BASE}/include)③
aux_source_directory($ENV{MBEDTLS_BASE}/library MBEDTLS_SOURCES)④
set(SOURCES⑤
${CMAKE_CURRENT_LIST_DIR}/ciphersuite-list.c
${MBEDTLS_SOURCES})
add_executable(ciphersuite-list ${SOURCES})⑥
1)设置CMake最低版本限制;
2)设置CMake工程名称为Ciphersuite-list;
3)设置mbedtls头文件路径;
4)添加mbedtls源文件输出到MBEDTLS_SOURCES变量中;
5)通过set函数定义一个名为SOURCES的变量,该变量包含mbedtls源文件以及示例代码ciphersuite-list.c;
6)定义可执行文件名为ciphersuite-list,该可执行文件依赖SOURCES变量。
3.编译与执行
行编译与执行过程如下:
# 进入示例所在路径
$ cd 02_start/linux/ciphersuite-list
# 新建一个build文件夹,用于保存临时文件
$ mkdir –p build & cd build
# 生成makefile文件
$ cmake ..
$ make
# 执行示例
$ ./ciphersuite-list
Available Ciphersuite:
[001] TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
[002] TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
[003] TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
[004] TLS-ECDHE-ECDSA-WITH-AES-256-CCM
[005] TLS-DHE-RSA-WITH-AES-256-CCM
[006] TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384
[007] TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384
[008] TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
[009] TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA
[010] TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA
// 省略部分内容
[125] TLS-PSK-WITH-AES-128-CBC-SHA256
[126] TLS-PSK-WITH-AES-128-CBC-SHA
[127] TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256
[128] TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256
[129] TLS-PSK-WITH-AES-128-CCM-8
[130] TLS-PSK-WITH-3DES-EDE-CBC-SHA
从输出结果可以看出,默认配置下的mbedtls支持130种安全套件。虽然mbedtls所支持的安全套件仅是IANA组织规定的一部分,但是在嵌入式物联网应用中,这些安全套件还是显得有些“臃肿”。
4.替换mbedtls配置文件
mbedtls可通过修改配置文件的方式进行裁剪,默认的配置文件位于{mbedtls代码仓库}/include/mbedtls/config.h文件中。虽然config.h文件中对于每一个参数均有详细的辅助说明,但是参数之间存在一定的依赖关系,所以从头编写一个配置文件往往需要不少实践经验。mbedtls提供了几种参考配置,这些参考配置详见configs文件夹。此处会使用config-mini-tls1_1.h文件作为配置文件,配置文件中启用了MBEDTLS_KEY_EXCHANGE_RSA_ENABLED宏定义,从后面的执行结果可以看出,列表中只保留了与RSA密钥协商相关的密码套件。config-mini-tls1_1.h的具体内容如代码清单2-6所示,该文件中相关配置含义和使用方法将在后续的章中逐个分析。
代码清单2-6 config-mini-tls1_1.h
#ifndef MBEDTLS_CONFIG_H
#define MBEDTLS_CONFIG_H
/* System support */
#define MBEDTLS_HAVE_ASM
#define MBEDTLS_HAVE_TIME
/* mbed TLS feature support */
#define MBEDTLS_CIPHER_MODE_CBC
#define MBEDTLS_PKCS1_V15
#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
#define MBEDTLS_SSL_PROTO_TLS1_1
/* mbedtls组件 */
#define MBEDTLS_AES_C
#define MBEDTLS_ASN1_PARSE_C
#define MBEDTLS_ASN1_WRITE_C
// 省略部分内容
5.再次编译执行
在编译过程中,通过CFLAG参数指定配置文件查找路径和自定义配置文件,本示例中配置文件位于{mbedtls代码仓库}/configs目录中,配置文件宏定义DMBEDTLS_CONFIG_FILE被赋值为<config-mini-tls1_1.h>。
# 进入示例所在路径
$ cd 02_start/linux/ciphersuite-list
# 进入build目录,删除编译文件
$ cd build && rm -rf *
# 生成makefile文件
$ CFLAGS="-I$MBEDTLS_BASE/configs -DMBEDTLS_CONFIG_FILE='<config-mini-tls1_1.h>'"
cmake ..
$ make
# 执行示例
$ ./ciphersuite-list
Available Ciphersuite:
[001]TLS-RSA-WITH-AES-256-CBC-SHA256
[002]TLS-RSA-WITH-AES-256-CBC-SHA
[003]TLS-RSA-WITH-AES-128-CBC-SHA256
[004]TLS-RSA-WITH-AES-128-CBC-SHA
[005]TLS-RSA-WITH-3DES-EDE-CBC-SHA
再次执行之后我们将发现,ciphersuite-list的输出内容产生了明显变化,此时mbedtls支持的安全套件仅有5个。mbedtls的模块化设计使用户可以根据实际需要裁剪安全组件,以达到最优配置。
- 点赞
- 收藏
- 关注作者
评论(0)