打印
[应用相关]

AT32基于mbed TLS的HTTPS服务器

[复制链接]
998|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 muyichuan2012 于 2022-10-12 19:34 编辑

AT32基于mbed TLS的HTTPS服务器




前言
传统的HTTP 使用明文传输,有心拦截传输数据的第三方都可以透过侧录封包知道传输的内容,在这
样的情况下传输的数据缺乏保障,若内容涉及个人隐私及银行的账号密码,将使个人蒙受巨大的损
失;为了保障数据传输的安全,HTTPS 应运而生,透过对传输双方的身份认证,将传输的内容加密,
使得恶意的第三方无法得知实际上传输的内容为何。本应用笔记将介绍如何使用mbed TLS 搭建一个
HTTPS 服务器,用户可以根据自己的应用去编写网页内容的同时,又简单地将传输数据加密。

支持型号列表:
AT32F407xx
AT32F437xx


目录
1 HTTPS 概述 ............................................ 5
2 例 HTTPS 服务器 .......................... 7
2.1 功能简介 ..................................... 7
2.2 资源准备 .................................... 7
2.3 软件设计 .................................. 7
2.3.1 使用 OpenSSL 建立自签凭证 ......... 9
2.4 实验效果 .................................. 10
3 文档版本历史 .............................. 12

1 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。


2 例 HTTPS 服务器
2.1 功能简介
本示例需要使用到 EMAC 的功能,搭配 LwIP 协议栈,此协议栈有提供 HTTPS 的 API, 但会使
用到 mbed TLS 的加密功能,这包库从 Keil 的官方网站或是透过 Keil 内的 Pack Installer 可以获
得。
图2. 透过Run-Time 管理器加入mbed TLS


2.2 资源准备
1) 硬件环境:
对应产品型号的AT-START BOARD
2) 软件环境
at32f4xx\project\mdk_v5
2.3 软件设计
1) 配置流程
 配置 EMAC 功能
 初始化 LwIP 协议栈
 配置私钥及 CA 凭证给服务器
 初始化 HTTPS 服务器
2) 代码介绍
 main 函数代码描述

main(void)
{
struct altcp_tls_config *tls_conf;
error_status status;
system_clock_config();
uart_print_init(115200);
at32_board_init();
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
delay_init();
status = emac_system_init();
while(status == ERROR);
tcpip_stack_init();
/* configure the private key and the certification of the server*/
tls_conf = altcp_tls_create_config_server_privkey_cert((const u8_t *)privkey_server_key, \
sizeof(privkey_server_key), \
NULL, \
0, \
(const u8_t *)privkey_ca, \
sizeof(privkey_ca));
if(tls_conf != NULL)
{
httpd_inits(tls_conf);
}
for(;;)
{
/* lwip receive handle */
lwip_rx_loop_handler();

/*timeout handle*/
lwip_periodic_handle(local_time);
}
}

2.3.1 使用 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
只需要在终端机中下命令
sudo apt install openssl
在确定 PC 上有 OpenSSL 这个工具后,基本上只要按照以下步骤,就一定可以建立出合法的自签
凭证:
1. 建立ssl.conf 配置文件

[req]
prompt = no
default_md = sha256
default_bits = 2048
distinguished_name = dn
x509_extensions = v3_req
[dn]
C = KY
ST = Cayman Islands
L = George Town
O = ARTERY
OU = SW Department
emailAddress = admin@example.com
CN = localhost
[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.localhost
DNS.2 = localhost
IP.1 = 172.31.96.101

上述配置文件内容的 [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):
openssl req -x509 -new -nodes -sha256 -utf8 -days 3650 -newkey rsa:2048 -keyout server.key -
out server.crt -config ssl.conf
生成的私钥与凭证档案会跟ssl.conf 在同一个目录下。
3. 汇入自签凭证到「受信任的跟证书授权单位」
光是建立好自签凭证还是不够的,网站服务器也设定正确才行,这毕竟是一个 PKI 基础架构,
你还必须让所有需要安全联机的端点都能互相信任才行,因此你还须将建立好的自签凭证安装
到「受信任的跟证书授权单位」之中,这样子你的操作系统或浏览器才能将你的自签凭证视为
「可信任的联机」。以下为手动汇入的步骤:
 开启档案总管,并鼠标双击 server.crt 档案
 点击「安装凭证」按钮
 选取「目前使用者」并按「下一步」继续
 选取「将所有凭证放入以下的存放区」并按下「浏览」按钮
 选取「受信任的跟证书授权单位」并按下「确定」
 按「下一步」继续
 按「完成」继续
 在 安全性警告 窗口按下「是(Y)」即可完成设定
4. 将私钥及凭证汇入到TLS server
TLS server 负责解密数据,在本应用笔记中就是MCU 端,分别将私钥及凭证填入demo code
中的SERVER_PRIVATE_KEY 及SERVER_CA_CER 即可。
2.4 实验效果
 浏览器的网址以HTTPS 开头,且锁头图示为上锁的状态
2022.9.19 第11 页 版本2.0.0
图3. HTTPS 页面


AN0150_AT32_HTTPS_server_based_on_mbed_TLS_ZH_V2.0.0.pdf

654.7 KB

AN0150_AT32_HTTPS_server_based_on_mbed_TLS_V2.0.0.zip

12.69 MB

使用特权

评论回复
沙发
sanfuzi| | 2022-11-1 18:18 | 只看该作者
HTTPS服务器需要什么网络设备呢?

使用特权

评论回复
板凳
primojones| | 2022-11-1 18:32 | 只看该作者
Mbed TLS是一个开源、可移植、易于使用、代码可读性高的SSL库。

使用特权

评论回复
地板
sesefadou| | 2022-11-1 19:02 | 只看该作者
http收到服务器性能怎么样              

使用特权

评论回复
5
yeates333| | 2022-11-1 19:33 | 只看该作者
mbedtls可以在单片机上吗

使用特权

评论回复
6
saservice| | 2022-11-1 20:19 | 只看该作者
https://tls.mbed.org/ mbedTLS 软件包这个不错。

使用特权

评论回复
7
qiufengsd| | 2022-11-2 17:07 | 只看该作者
之前使用arduino配置过服务器了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

1899

帖子

28

粉丝