《密码技术与物联网安全:mbedtls开发实战》 —2.4.2 遍历 mbedtls 安全套件

举报
华章计算机 发表于 2019/12/16 14:07:49 2019/12/16
【摘要】 本节书摘来自华章计算机《密码技术与物联网安全:mbedtls开发实战》 一书中第2章,第2.4.2节,作者是徐 凯 崔红鹏 。

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

 image.png

图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的模块化设计使用户可以根据实际需要裁剪安全组件,以达到最优配置。



【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。