mbedtls使用openssl生成的自签名证书进行TLS实验

2023-05-16

目录

    • 1 使用openssl生成自签名证书
    • 2 VS2013编译mbedtls
    • 3 mbdtls默认对证书的要求
    • 4 mbdtls测试例子详解
    • 5、运行测试程序

1 使用openssl生成自签名证书

openssl是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。其下载链接为https://www.openssl.org/。在ubuntu系统的安装方法,将源码拷贝到ubuntu中,然后执行下列语句:

			sudo ./config  注:稍后测试,修改安装目录
			sudo make
			sudo make install
			

生成自签名证书:

	生成RSA私钥(无加密)ca.key
	openssl genrsa -out ca.key 2048
	生成自签名证书ca.crt
	openssl req -new -x509 -key ca.key -out ca.crt -days 365

注:需要注意Common Name (e.g. server FQDN or YOUR name) []:localhost,实际应用时应该是要对应自己的域名,如果不匹配握手会失败

生成服务端证书:

	生成RSA私钥(无加密)server.key
	openssl genrsa -out server.key 2048
	生成证书请求server.csr
	openssl req -new -key server.key -out server.csr        
	使用我们生成的ca.crt对我们的server.csr进行签名
	openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365

生成客户端证书:

	生成RSA私钥(无加密)client.key
	openssl genrsa -out client.key 2048
	生成证书请求client.csr
	openssl req -new -key client.key -out client.csr        
	使用我们生成的ca.crt对我们的client.csr进行签名
	openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt -days 365

2 VS2013编译mbedtls

下载mbdtls源码,这里需要下载稳定版本的源码,才会有vs的工程,开发版本的源码是没有vs的工程的,下载完源码后打开如下目录:
mbedtls-2.16.5-apache\mbedtls-2.16.5\visualc\VS2010
选择ssl_server工程进行编译,会出现如下错误:
在这里插入图片描述
由图可知缺少windows的文件,在系统环境变量增加两个变量,如下所示:
WindowsSDK_LibraryPath_x86 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;
WindowsSDK_IncludePath C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include;
在这里插入图片描述出现如下错误时
在这里插入图片描述
修改平台集为Visual Studio 2013 - Windows XP (v120_xp),到此可正常完成编译。

3 mbdtls默认对证书的要求

	 配置的结构体位于x509_crt.c
const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default =
{
#if defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES)
    /* Allow SHA-1 (weak, but still safe in controlled environments) */
    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) |
#endif
    /* Only SHA-2 hashes */
    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 ) |
    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |
    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) |
    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ),
    0xFFFFFFF, /* Any PK alg    */
    0xFFFFFFF, /* Any curve     */
    2048,// 密钥长度为2048 
};
注:这里表示最低支持密钥长度为2048

4 mbdtls测试例子详解

单向认证例子验证:
在ssl_client.c中将下列代码的MBEDTLS_SSL_VERIFY_OPTIONAL修改为MBEDTLS_SSL_VERIFY_REQUIRED模式
mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
如果设置为MBEDTLS_SSL_VERIFY_OPTIONAL模式,那么客户端不会验证服务器证书的有效性,换句话说,即使验证失败,也可以正常通信,甚至于将CA测试证书mbedtls_test_cas_pem删除也没有关系。

    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,
                          mbedtls_test_cas_pem_len );
    if( ret < 0 )
    {
        mbedtls_printf( " failed\n  !  mbedtls_x509_crt_parse returned -0x%x\n\n", -ret );
        goto exit;
    }

单向认证的情况下,服务器端持有服务器证书(server.crt),CA证书(ca.crt),和服务器私钥(server.key),这些可用我们上述生成的证书文件,用winhex保存成数组后(末尾添加0x00)使用。

    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) servercrt,
                          sizeof(servercrt) );
    if( ret != 0 )
    {
        mbedtls_printf( " failed\n  !  mbedtls_x509_crt_parse returned %d\n\n", ret );
        goto exit;
    }

    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) cacrt,
		sizeof(cacrt));
    if( ret != 0 )
    {
        mbedtls_printf( " failed\n  !  mbedtls_x509_crt_parse returned %d\n\n", ret );
        goto exit;
    }

	ret = mbedtls_pk_parse_key(&pkey, (const unsigned char *)server_key,
		sizeof(server_key), NULL, 0);
    if( ret != 0 )
    {
        mbedtls_printf( " failed\n  !  mbedtls_pk_parse_key returned %d\n\n", ret );
        goto exit;
    }

客户端持有CA证书(ca.crt),以求对服务器的证书做验证.

    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) cacrt,
                          sizeof(cacrt) );
    if( ret < 0 )
    {
        mbedtls_printf( " failed\n  !  mbedtls_x509_crt_parse returned -0x%x\n\n", -ret );
        goto exit;
    }

双向认证例子验证:
双向认证的情况下,服务器端持有服务器证书(server.crt),CA证书(ca.crt),和服务器私钥(server.key),客户端持有客户端证书(client.crt),CA证书(ca.crt)客户端私钥(client.crt),这些可用我们上述生成的证书文件,用winhex保存成数组后(末尾添加0x00)使用。
服务端验证代码需要增加

	mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);

客户端代码改动如下:

#if 1
	ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *)clientcrt,
		sizeof(clientcrt));
	if (ret < 0)
	{
		mbedtls_printf(" failed\n  !  mbedtls_x509_crt_parse returned -0x%x\n\n", -ret);
		goto exit;
	}

#endif
    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) cacrt,
                          sizeof(cacrt) );
    if( ret < 0 )
    {
        mbedtls_printf( " failed\n  !  mbedtls_x509_crt_parse returned -0x%x\n\n", -ret );
        goto exit;
    }
#if 1
	mbedtls_pk_context pkey;
	mbedtls_pk_init(&pkey);
	ret = mbedtls_pk_parse_key(&pkey, (const unsigned char *)client_key,
		sizeof(client_key), NULL, 0);
	if (ret != 0)
	{
		mbedtls_printf(" failed\n  !  mbedtls_pk_parse_key returned %d\n\n", ret);
		goto exit;
	}
#endif

以及

    /* OPTIONAL is not optimal for security,
     * but makes interop easier in this simplified example */
	mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
    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, stdout );
	
	if ((ret = mbedtls_ssl_conf_own_cert(&conf, &cacert, &pkey)) != 0)
	{
		mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_own_cert returned %d\n\n", ret);
		goto exit;
	}

注:如果没有调用mbedtls_ssl_conf_own_cert,那么我们的证书就没有设置到,双向认证时,握手就会由于服务器读不到客户端证书而导致失败。

5、运行测试程序

	先运行服务器程序,再运行客户端程序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mbedtls使用openssl生成的自签名证书进行TLS实验 的相关文章

  • Qt中QString与String的互相转换

    前言 Qt中的一些类型是Qt自己封装的 xff0c 例如我们平常常见的String在Qt中就是QString xff0c 但是有时我们调用第三方库时 xff0c 参数要求是String xff0c 这时我们就需要把QString转换成Str
  • Mat与QImage互相转换

    前言 Mat是opencv中的存储图像的容器 xff0c 也是图像像素矩阵 QImage是Qt中存储图片常用的类 Qt和opencv经常配合在一起使用 xff0c 但Qt的函数方法的参数是不接受Mat的 xff0c 所以如果我们想要在Qt中
  • CentOS7下安装libevent

    前言 CentOS7下安装libevent网络库 步骤 创建一个文件夹libevent xff08 方便后期维护管理 xff09 mkdir libevent 官网下载源码包 可以在本机下载然后文件传输 xff0c 也可以直接在linux下
  • Libevent源码深度剖析-张亮(转载)

    https blog csdn net xp178171640 article details 105490027
  • Qt6.4.3编译MySQL驱动

    前段时间电脑坏了重装了操作系统 软件都不能正常运行 大部分都得重装 本来用的Qt5 14 2 想着Qt都出6了 那就用用Qt6吧 Qt6想用mysql数据库也是得自己编译驱动的 但Qt6也是想推广CMake 所以我以前Qt5那一套编译mys
  • keil5中如何在一个项目中新建源文件

    哈喽哈喽 xff0c 昨天在学习如何点灯的时候接触到可以在一个已经建立好的项目中 xff0c 建立一个新的源文件写一个新的代码 这里就总结一下 点开file选择new xff0c 就会发现右边多个栏就说明源文件多了一个 xff0c 这个时候
  • 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因 xff0c 需要用到Python模拟登录网站 xff0c 但是以前对这块并不了解 xff0c 而且目标网站的登录方法较为复杂 xff0c 所以一下卡在这里了 xff0c 于是我决定从简单的模拟开始 xff0c 逐渐深入地研
  • 【VSCode】C++环境配置(小白必看)

    关于VSCode的c 43 43 环境配置 网上教程很多 xff0c 但大多是入门的新手小白难以理解 xff0c 操作不来的 xff0c 作者本人也是捣鼓了很久才配置好c 43 43 运行环境 本篇文章会从头到尾简述 一下vscode配置c
  • at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式

    at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式 半导体制冷片模拟除湿制冷 超声波雾化模块加湿 温湿度传感器检查环境温湿度 LCD液晶屏显示系统工作状态 全套包括实物成品 xff0c 原
  • Java常用类 - String类详解

    Java常用类 String类 创建字符串 xff1a 每个双引号括起来的字符串常量都是String类的一个实例 xff1b 也可以new 连接字符串 xff1a 43 xff1b string1 concat string2 span c
  • 如何利用#将宏定义中的参数插入到字符串中?

    首先明白几个原理 xff1a 在宏定义中 xff0c 如果宏参数为字符串 xff0c 可以把这个字符串放到字符串中 xff0c 但如果宏参数为变量的话就不可以 可以把宏定义中的参数转化为相应的字符串 xff0c 这时就可以把这个参数放到字符
  • ssmJavaEE无人机数据管理系统 毕业设计源码111022

    ssm无人机数据管理系统 摘 要 随着互联网趋势的到来 xff0c 各行各业都在考虑利用互联网将自己推广出去 xff0c 最好方式就是建立自己的互联网系统 xff0c 并对其进行维护和管理 在现实运用中 xff0c 应用软件的工作规则和开发
  • 【C语言】字符串函数strcat即自主实现

    目录 一 strcat函数 二 自主实现strcat 一 strcat函数 1 功能 xff1a 连接字符串 将源字符串的副本追加到目标字符串 目标中的终止空字符被源的第一个字符覆盖 xff0c 并在目标中两者的连接形成的新字符串的末尾包含
  • 2023版Postman接口测试使用全指南(原来使用 Postman测试API接口如此简单)

    下面是一篇详细介绍postman接口测试的文章 xff0c 如果文章内容不太明白的话 xff0c 我建议看看视频版本 xff0c 更加清洗 xff0c 更加直观 xff01 最详细的postman接口测试实战教程 哔哩哔哩 bilibili
  • Qt QDebug格式输出、自定义类输出及重定向输出Log

    1 qDebug 格式化输出 qDebug格式化支持printf的格式化标识符 如果向函数传递格式字符串和参数列表 xff0c 它的工作方式类似于C printf 函数 格式应该是Latin 1字符串 格式化demo 代码如下 xff08
  • Qt读取GPS数据

    1 型号版本 GPS型号为ublox xff08 EVK M8L xff09 xff0c 配有USB接口 xff0c Qt版本5 7 2 实现步骤 xff1a 1 实现串口通信 采用Qt5 7 内置的串口操作类QSerialPort和QSe
  • 解决问题备忘:Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》

    环境 xff1a php7 3 4nts lt php 新手 xff0c 不会较为规范的代码 xff0c 如下 xff1a header 34 Access Control Allow Origin 34 openid 61 empty G
  • C语言 在字符串1中找字符串2首次出现的位置(strstr的缩减版)

    目录 题目 一 想法 二 实现代码 1 strstr 函数部分 注意点 2 main函数部分 3 完整代码 总结 题目 描述 编写一个函数 xff0c 函数的目的是在字符串1中找字符串2首次出现的位置 xff1b 输入 分为两行 xff0c
  • STM32F103之点亮LED二、结构体封装寄存器

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 点亮LED二 xff1a 合封寄存器之结构体 前言一 基地址分析二 结构体封装寄存器三 引用结构体总结 前言 外设寄存器的地址都是基于外设
  • 彻底解决cmake编译过程中fatal error: OpenNI.h: 没有那个文件或目录

    环境 xff1a ubuntu20 04 在cmake编译过程中 xff0c 最常见的莫过于fatal error xxxx h 没有那个文件或目录 这个问题困扰着很多初学者 xff0c 原因是没有找到某个头文件 xff0c 小白版的解决方

随机推荐

  • 【Ubuntu20.04网络配置--设置静态IP ping通开发板 】

    Ubuntu20 04网络配置 设置静态IP ping通开发板 环境准备windows 主机网络配置开发板 ping Windows主机ubuntu 网络配置配置ubuntu网络设置静态IP 修改IP配置文件让设置的静态IP配置生效查看配置
  • 在ros2 foxy安装镭神M10激光雷达

    前言 记录ros2 机器人开发历程 xff0c 全当做个笔记 xff0c 以后用到好查找 xff0c 也给后来者留下一些脚印 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 环境 环境 xff1a ubuntu
  • Authentication认证和Authorization授权的作用

    认证 Authentication xff1a 你是谁 授权 Authorization xff1a 你有权限干什么 认证意味着确认自己的身份 xff0c 而授权意味着授予对系统的访问权限 简单来说 xff0c 认证是验证身份的过程 xff
  • 51单片机串口通信的原理及使用方法(附串口收发数据例程代码)

    温馨提示 xff1a 本篇文章详细介绍了串口的原理及使用方法 xff0c 涉及的内容较多 xff0c 但也较为全面 xff0c 学者若想充分掌握串口通信的原理和具体使用方法 xff08 部分限于51单片机 xff09 xff0c 请静下心来
  • RoboMaster大疆开发板C型入门学习(1)配置加流水灯(循环亮灯

    cubeMX新建工程 xff0c 这里我们假设已经安装好了cubeMX 我们本次使用Clion进行相关操作 在这里我们使用STM32F407IGHx芯片 在System Core下选择RCC选项 xff0c 在RCC mode and Co
  • 如何使用cvx工具箱求解凸优化问题呢?

    以下是一个简单的MATLAB求解凸优化问题的案例 xff0c 使用cvx 工具箱求解 xff1a 1 导入cvx工具箱 addpath 39 cvx 39 2 定义问题 n 61 2 变量数量 x 61 sym 39 x 39 n 1 定义
  • 基于stm32单片机智能导盲拐杖源程序Proteus仿真设计

    功能介绍 xff1a 采用stm32单片机作为主控CPU xff0c 采用srf05超声波模块测量障碍物距离 xff0c LCD1602显示屏显示当前的障碍物距离 xff0c 通过传感器测量障碍物的距离的远近来进行相关报警 xff0c 距离
  • virtualbox上安装ubuntu20.04清华源镜像

    一 下载Ubuntu镜像文件 这里我选择国内清华源下载ubuntu镜像文件 步骤一 xff1a 清华源下载地址 xff1a Index of ubuntu releases 20 04 清华大学开源软件镜像站 Tsinghua Open S
  • 计算机视觉(一):初识OpenCV,更好更快掌握OpenCV

    计算机视觉 xff08 一 xff09 xff1a 初识OpenCV 近几个月 xff0c 也是一直在寻找自己以后的方向 xff0c 一直在迷茫中 xff0c 但也在不断得探索着 觉得自己最感兴趣的还是计算机技术这一块 xff0c 尤其是计
  • 虚拟机扩容(超详细实测好用步骤)

    第一步 xff1a 把虚拟机关机 第二步 xff1a 点击编辑虚拟机设置 xff0c 选择硬盘 xff0c 点击扩展 xff0c 如下图 xff1a 第三步 xff1a 输入你现在想要的磁盘大小 xff08 如果你原来是200G xff0c
  • 结构体的对齐规则(结构体的计算)

    1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数 与 该成员大小的较小值 3 结构体总大小为最大对齐数 xff08 每个
  • hostapd 配置项解析

    hostapd 配置项解析 1 interface2 wps state3 hw mode4 channel5 beacon int6 max num sta 1 interface 一般默认interface 61 wlan0 注 xff
  • 滑动窗口算法总结

    算法目的 滑动窗口法 xff0c 也叫尺取法 xff08 可能也不一定相等 xff0c 大概就是这样 61 61 xff09 xff0c 可以用来解决一些查找满足一定条件的连续区间的性质 xff08 长度等 xff09 的问题 由于区间连续
  • linux软链接的创建、删除和更新

    大家都知道 xff0c 有的时候 xff0c 我们为了省下空间 xff0c 都会使用链接的方式来进行引用操作 同样的 xff0c 在系统级别也有 在Windows系列中 xff0c 我们称其为快捷方式 xff0c 在Linux中我们称其为链
  • 进程、线程、多进程、多线程的优缺点和区别

    进程 xff1a 是并发执行的程序在执行过程中分配和管理资源的基本单位 xff0c 是一个动态概念 xff0c 竞争计算机系统资源的基本单位 线程 xff1a 是进程的一个执行单元 xff0c 是进程内科调度实体 比进程更小的独立运行的基本
  • Postman 汉化(Postman中文版)

    1 首先从官网下载postMan安装包 postman官网下载地址 Download Postman Get Started for Free 2 下载postMan 汉化包 app zip postman汉化包 Releases hlmd
  • UDP的客户端和服务器端的实例(VC6.0实现)

    服务器端程序 xff1a UdpServer cpp Defines the entry point for the console application include 34 stdafx h 34 include lt stdio h
  • STM32中关于串口中断的调试(不断进入发送中断的原因)

    说来惭愧 xff0c 前日在调试stm32f10系列的单片机的时候 xff0c 想做一个关于串口发送的状态机 xff0c 每隔100毫秒发送一次命令 没有用DMA xff0c 就是想单纯的使用发送中断来数据 xff0c 结果在调试的时候一直
  • Psoc Creator 入门——空工程的建立

    最近在做psoc 4000芯片的开发 xff0c 现在简单的说说怎么利用psoc creator进行开发 首先 xff0c 安装psoc creator xff0c 我使用的版本是4 0 安装过程省略 xff0c 赛普拉斯官网有下载链接 x
  • mbedtls使用openssl生成的自签名证书进行TLS实验

    目录 1 使用openssl生成自签名证书2 VS2013编译mbedtls3 mbdtls默认对证书的要求4 mbdtls测试例子详解5 运行测试程序 1 使用openssl生成自签名证书 openssl是一个安全套接字层密码库 xff0