引言:

本文将介绍使用CH32V307VCT6以及官方协议栈(libwchnet)搭配Mbedtls作为客户端通过HTTPS访问百度并获取百度首页数据。

一、HTTPS概述与SSL/TSL简介

HTTPS(SecureHypertextTransferProtocol)安全超文本传输协议,它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。

SSL是一种用于加密数据传输的协议,通过加密和身份验证机制保护数据的机密性、完整性和身份验证。它广泛应用于HTTPS、SMTPS、FTPS等场景,但已被更安全的TLS协议取代。

SSL/TSL认证方式:

  • 单向认证:通过数字证书,只验证服务器的身份。
  • 双向认证:通过数字证书,同时验证客户端和服务器身份。

二、Mbedtls与libwchnet简介

市面上有很多TLS/DTLS实现工具包,知名的工具包包括OpenSSL、wolfssl和mbedtls,其中OpenSSL常用于互联网应用,而mbedtls用于物联网应用。mbedtls使开发人员可以非常轻松地在嵌入式产品中加入物联网安全功能。相比于OpenSSL这样的工具,mbedtls小巧灵活且易于使用。

‌libwchnet是一个轻量级的网络通信库,通常用于嵌入式系统或资源受限的环境中,提供基础的网络通信功能。提供TCP/UDP通信、Socket封装、数据包处理等基础网络功能,代码简洁,SocketAPI简单易用。

三、CH32V307VCT6软件实现(单向认证)

3.1、准备工具

1)、开发软件:MounRiver Studio(MRS)(下载安装可参考:https://www.cnblogs.com/wchmcu/p/17082520.html

2)、Mbedtls版本:3.6.0(可在附件下载)

3)、CH32V307EVT例程(可在官网下载https://www.wch.cn/downloads/CH32V307EVT_ZIP.html

4)、CH32V307VCT6评估板或开发板1块

5)、可运行openssl的环境(非必须)

3.2、解压CH32V307EVT.zip,打开DNS例程(路径:CH32V307EVT \EVT\EXAM\ETH\DNS),在DNS例程基础上添加TCP客户端功能,需如下代码:

TCP接收缓冲区与net.config.h中的WCHNET_NUM_TCP也需要设置,不然无法接收TCP的数据。

完成以上工作后,可实现CH32V307VCT6通过DHCP拿到自己的IP以及通过DNS拿到百度的IP并建立TCP连接,只是无法实现数据通信,因为数据通信需要TLS握手后(单向认证)才能进行,下面就需要用到Mbedtls实现TLS握手以及借助Mbedtls实现的收发数据的API来实现握手后的数据通信能力,比如获取baidu的首页。

3.3、解压mbedtls-development.zip并将include与library两个目录添加到DNS工程中,添加方法可参考:

https://blog.csdn.net/qq_36353650/article/details/128468104中的Q8与Q9

效果如下:

3.4、基于CH32V307与libwchnet实现随机数生成函数以及数据收发API供Mbedtls调用,具体实现如下:

3.5、修改mbedtls_config.h,用于启用相关的平台支持以及加密组件,修改mbedtls_config.h,用于启用相关的平台支持以及加密组件,对方服务器支持的TLS版本与加密组件可通过openssl :openssl s_client 180.101.51.73:443获得。

3.6、对mbedtls_ssl进行初始化以及实现握手操作

3.7、握手成功后即可通过mbedtls_ssl_write()与mbedtls_ssl_read()来实现加密数据收发。

3.7、如发现编译时RAM不够用可适当调整工程中的link.ld文件即可。

Mbedtls版本:3.6.0 -> https://files.cnblogs.com/files/blogs/745523/mbedtls-development.zip?t=1747454347&download=true

完整示例工程 -> https://files.cnblogs.com/files/blogs/745523/Connect_baidu_1v0.zip?t=1747454370&download=true

基于libwchnet&Mbedtls实现HTTPS的更多相关文章

  1. 构建基于Netty 的HTTP/HTTPS 应用程序

    HTTP/HTTPS是最常见的协议套件之一,并且随着智能手机的成功,它的应用也日益广泛,因为对于任何公司来说,拥有一个可以被移动设备访问的网站几乎是必须的.这些协议也被用于其他方面.许多组织导出的用于 ...

  2. 基于Apache搭建HTTP HTTPS

    参考资料 <openssl攻略>--第一章 <Apache服务器配置与使用工作笔记>-- 第六章 第十四章 https://juejin.im/post/5a31faf2518 ...

  3. Netty 框架学习 —— 基于 Netty 的 HTTP/HTTPS 应用程序

    通过 SSL/TLS 保护应用程序 SSL 和 TLS 安全协议层叠在其他协议之上,用以实现数据安全.为了支持 SSL/TLS,Java 提供了 javax.net.ssl 包,它的 SSLConte ...

  4. 基于SpringBoot项目的https

    在spring中配置项目运行的端口很简单. 在application.properties中 server.port: 这样配置后,spring boot内嵌的tomcat服务器就是跑在8080端口启 ...

  5. haproxy配置基于ssl证书的https负载均衡

    本实验全部在haproxy1.5.19版本进行测试通过,经过测试1.7.X及haproxy1.3版本以下haproxy配置参数可能不适用,需要注意版本号. 一.业务要求现在根据业务的实际需要,有以下几 ...

  6. 【LNMP】基于阿里云的https免费证书配置

    1 登录阿里云账户,左侧菜单选择    ->   2 右上角选择购买证书,选择免费型 3 按照流程购买,回到订单列表.填写认证信息,选择DNS解析,  在列表 选择下载证书 4 我的服务器是ng ...

  7. 基于Swoole的HTTP/HTTPS代理

    N行代码实现一个简单的代理服务器 <?php /** * Web代理服务器(支持http/https) * @author zhjx922 */ class WebProxyServer { p ...

  8. 基于SSL(TLS)的HTTPS网页下载——如何编写健壮的可靠的网页下载

    源码下载地址案例开发环境:VS2010本案例未使用openssl库,内部提供了sslite.dll库进行TLS会话,该库提供了ISSLSession接口用于建立SSL会话. HTTP协议很简单,写个简 ...

  9. 基于httpd2.2配置https

    本次演示使用一台主机实现,即自签自演 主机IP:192.168.1.105 开始配置: 1.创建私有CA # cd /etc/pki/CA # touch serial # touch index.t ...

  10. 网站部署 HTTPS 中需要做的事情

    这篇文章首发于我的个人网站:听说 - https://tasaid.com/,建议在我的个人网站阅读,拥有更好的阅读体验. 这篇文章与 博客园 和 Segmentfault 共享. 前端开发QQ群:3 ...

随机推荐

  1. Linux - VMware workstation安装虚拟机

    Step1:新建虚拟机 主页/文件 >> 创建新的虚拟机 新建虚拟机向导 典型(推荐)(T) 通过几个简单的步骤创建Workstation虚拟机 自定义(高级)(C) 创建带有SCSI控制 ...

  2. Windows 提权-UAC 绕过

    本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...

  3. 面试题54. 二叉搜索树的第k大节点

    地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ <?php /** 面试题54. ...

  4. Ubuntu20.04 安装 .NET Core SDK

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-micr ...

  5. k8s:The connection to the server localhost:8080 was refused - did you specify the right host or port?

    前言 k8s 集群 node节点报错:The connection to the server localhost:8080 was refused - did you specify the rig ...

  6. Golang 入门 : 文件名、关键字与标识符

    Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go .如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go ...

  7. Linux权限与特殊权限

    目录 5.1 权限讲解 5.1.1 什么是权限 5.1.2 为什么要管理权限 5.1.3 权限的分类 5.1.4 Linux的文件属于谁? 5.1.5 文件属主.属组.其他用户 5.1.6 所属者的表 ...

  8. java的数据类型之基本类型

    强类型语言 要求变量的使用要严格符合规定,所有变量都必须先定义后使用.如果没有按照指定要求使用变量,则该变量将报错.java就是强类型语言. java的两大数据类型 1.基本类型 2.引用类型 其中基 ...

  9. FastMCP实践开发应用

    一.概述 FastMCP是一个基于Python的高级框架,用于构建MCP(Model Context Protocol)服务器.它能够帮助开发者以最小的代码量创建MCP服务器,从而让AI助手能够更好地 ...

  10. CyclicBarrier的await()方法底层原理

    一.定义 CyclicBarrier 的 await() 方法是其核心功能之一,用于让线程在屏障点等待,直到所有参与的线程都到达屏障后,才能继续执行. 其底层实现依赖于 AQS(AbstractQue ...