雅特力AT32 MCU基于mbed TLS的HTTPS服务器

cathy的头像
cathy 发布于:周一, 01/08/2024 - 11:48 ,关键词:

HTTPS概述

HTTPS的安全性是基于Transport Layer Security (TLS), TLS是一种网络加密通信的方式,作为Secure Sockets Layer (SSL)的接续协议,TLS允许客户端与服务端的互相验证。TLS以凭证为概念,凭证包含:公钥、服务器身份、凭证颁发单位的签名。对应的私钥永远不会公开,任何使用私钥加密的密钥数据只能用公钥来解密,反之亦然。整个加密通信流程,可以透过图1来简单描述:

1. 客户端发起hello交握:给服务器的讯息有:

  • 包含时间戳的32位随机数字client_random
  • 加密协定
  • 客户端支持的加密方式

2. 服务端必须要有一套证书,可以自制或向组织申请。自己颁发的证书需要客户端验证通过,才可以继续访问,使用受信任单位申请的证书不会弹出提示页面。

3. 一对公钥和私钥,可以想象成一把钥匙(私钥)和一个锁头(公钥),把锁头给客户端将重要的数据锁起来,客户端将锁好的数据传给服务器,只有服务器有开锁的钥匙可以解开,所以即使传送过程被截取也无法破解。

4. 对于客户端的hello交握,服务端响应以下讯息给客户端:

  • 另一个包含时间戳的32位随机数字server_random
  • 加密协定
  • 加密方式
  • 服务器证书:包含拥有者名称、网站地址、证书公钥、证书颁发机构数字签名、过期时间等。

5. 客户端验证服务器传来的凭证是否有效?例如颁发机构、过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。(本应用笔记不是使用第三方证书授权中心(CA)签发的凭证,而是使用自己颁发的凭证,所以客户端必须先取得签发机构的公钥(下一节的kvm5.pem)来验证颁发机构签名,才不会弹出警告框)

6. 在此之前的所有TLS交握讯息都是明文传送,现在收到服务器的证书且验证没问题,则客户端先产生PreMaster_Secret

  • 使用加密算法,例如:RSA, Diffie-Hellman,对server_random运算产生。

  • 或称PreMaster_Key

  • 是一个48个位的Key,前2个字节是协议版本号,后46字节是用在对称加密密钥的随机数字。

7. 客户端用服务端送来的公钥加密PreMaster_Secret。

8. 客户端将加密的PreMaster_Secret传送给服务端,目的是让服务端可以像客户端用一样随机值产生Master_Secret。

9. 服务端用私钥解密PreMaster_Secret。

  • 此时客户端与服服务端都有一份相同的PreMaster_Secret和随机数client_random, server_random。

  • 使用client_random及server_random当种子,结合PreMaster_Secret,客户端和服务端将计算出同样的Master_Secret。
  • 作为资料加解密相关的Key Material。

10. 作为资料加解密相关的Key Material。

11. 作为资料加解密相关的Key Material。

1.png

图1. HTTPS原理

例 HTTPS服务器

功能简介

本示例需要使用到EMAC的功能,搭配LwIP协议栈,此协议栈有提供HTTPS的API, 但会使用到mbed TLS的加密功能,这包库从Keil的官方网站或是透过Keil内的Pack Installer可以获得。

2.png

图2. 透过Run-Time管理器加入mbed TLS

资源准备

1) 硬件环境:

对应产品型号的AT-START BOARD

2) 软件环境

at32f4xx\project\mdk_v5

软件设计

1) 配置流程

  • 配置EMAC功能

  • 初始化LwIP协议栈
  • 配置私钥及CA凭证给服务器
  • 初始化HTTPS服务器

2) 代码介绍

  • ssl_server函数代码描述

3.png

使用OpenSSL建立自签凭证

在本应用笔记中,我们将使用自签凭证来建立TLS联机,而发行自签凭证会使用到OpenSSL这个工具,以下会简单介绍在Windows上及在Linux Ubuntu上,如何安装OpenSSL。

  • Windows

因为OpenSSL未提供可执行的安装档,因此我们透过Git for Windows来达到安装OpenSSL的目的;当安装完成后,默认执行文件路径为C:\Program Files\Git\usr\bin\openssl.exe,你可以将C:\Program Files\Git\usr\bin路径加入到PATH环境变量之中,以后就可以直接输入openssl来执行此工具。

  • Ubuntu

只需要在终端机中下命令

4.png

在确定PC上有OpenSSL这个工具后,基本上只要按照以下步骤,就一定可以建立出合法的自签凭证:

1. 建立ssl.conf配置文件

5.png

上述配置文件内容的[dn]区段(Distinguished Name)为凭证的相关信息,你可以自由调整为你想设定的内容,其中O(Organization)是公司名称,OU(Organization Unit)是部门名称,而CN(Common Name)则是凭证名称,你可以设定任意名称,设定中文也可以,但请记得档案要以UTF-8编码存盘,且不能有BOM字符。

配置文件的[alt_names]区段,则是用来设定SSL凭证的域名,这部分设定相当重要,如果没有设定的话,许多浏览器都会将凭证视为无效凭证。这部分你要设定几组域名都可以,基本上没有什么上限,因为自签凭证主要目的是用来开发测试之用,因此建议可以把可能会用到的本机域名(localhost)或是局域网络的IP地址都加上去,以便后续进行远程联机测试。

2. 打开终端机工具后,切换到存放ssl.conf的目录下后,透过OpenSSL命令产生出自签凭证与相对应的私钥,输入以下命令就可以建立出私钥(server.key)与凭证档案(server.crt):

6.png

生成的私钥与凭证档案会跟ssl.conf在同一个目录下。

3. 汇入自签凭证到「受信任的跟证书授权单位」

光是建立好自签凭证还是不够的,网站服务器也设定正确才行,这毕竟是一个PKI基础架构,你还必须让所有需要安全联机的端点都能互相信任才行,因此你还须将建立好的自签凭证安装到「受信任的跟证书授权单位」之中,这样子你的操作系统或浏览器才能将你的自签凭证视为「可信任的联机」。以下为手动汇入的步骤:

  • 开启档案总管,并鼠标双击server.crt档案
  • 点击「安装凭证」按钮
  • 选取「目前使用者」并按「下一步」继续
  • 选取「将所有凭证放入以下的存放区」并按下「浏览」按钮
  • 选取「受信任的跟证书授权单位」并按下「确定」
  • 按「下一步」继续
  • 按「完成」继续
  • 在安全性警告窗口按下「是(Y)」即可完成设定

4. 将私钥及凭证汇入到TLS server

TLS server负责解密数据,在本应用笔记中就是MCU端,分别将私钥及凭证填入demo code中的mbedtls_test_srv_key及mbedtls_test_srv_crt即可。

实验效果

  • 浏览器的网址以HTTPS开头,且锁头图示为上锁的状态
7.png
图3. HTTPS页面

来源:AT32 MCU 雅特力科技

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 75