本篇文章主要是介绍客户端认证服务器的 AT 指令操作以及问题分析。
1 SSL 认证涉及到的指令介绍
1.1 AT+SYSFLASH
查询或读写 flash 用户分区
通过查询 ESP-AT 指南,如下:
- 查询指令
AT+SYSFLASH?
- 读写指令
AT+SYSFLASH=<operation>,<partition>,<offset>,<length>
1.2 AT+CIPSSLCCONF
查询/设置 SSL 客户端配置
通过查询 ESP-AT 指南,如下:
- 查询指令
AT+CIPSSLCCONF?
- 单连接读写指令
AT+CIPSSLCCONF=<auth_mode>[,<pki_number>][,<ca_number>]
- 多连接读写指令
AT+CIPSSLCCONF=<linkID>,<auth_mode>[,<pki_number>][,<ca_number>]
2 客户端认证服务器 AT 指令操作步骤
2.1 生成证书 bin
具体操作可以参考 generate-pki-bin。
2.2 将 CA 证书更新到 flash
指令如下:
AT+SYSFLASH=0,"client_ca",0,4096
AT+SYSFLASH=1,"client_ca",0,1424
操作步骤参考下图,加载完证书之后,点击发送文件返回 OK ,就表示更新证书成功了。
补充说明:
1. client_ca 是自己做客户端 (AT+CIPSTART=…) 用的,用来校验服务器传过来的证书。
2. server_ca 是自己做服务器 (AT+CIPSERVER=1) 用的,用来校验连接到服务器上的客户端,传过来的证书。
3. 擦除分区的时候需要保持 4 字节对齐,写分区输入实际的大小即可,例如上面证书中 at_ca.bin 是 1.4 KB, 算下来是 1433.6 byte。
2.3 SSL 认证操作
对应操作 log 如下:
AT+CWMODE=1
OK
AT+CWJAP="iot",""
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"
OK
AT+CIPSSLCCONF=2,0,0
OK
AT+CIPSTART="SSL","192.168.3.129",8739
CONNECT
OK
CLOSED
3 常见问题以及排查方向
3.1 本地搭建的 ssl server 服务器,测试单向认证(服务器端)发现连接失败
本地服务器的配置如下:
UART1 端 AT 测试指令 & log 如下:
AT+CWMODE=1
OK
AT+CWJAP="iot",""
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIPSSLCCONF=2,0,0 //配置单向连接
OK
AT+CIPSTART="SSL","192.168.3.129",8739
ERROR
UART0 端 log 如下:
max tx power=78,ret=0
BLUFI BLE is not connected yet
ca_len=1164
set ca ok
[0;31mE (165183) esp-tls: mbedtls_ssl_handshake returned -0x2700[0m
[0;31mE (165184) esp-tls: Failed to open new connection[0m
ssl failed
ssl create 0 socket fail
从 log 信息中可以看到 -0x2700 表示服务器端的证书验证失败了。此时的排查方向为:
-
先确认服务器和证书是没有问题的,从服务器端获取到 CA 证书,通过 openssl 指令验证。指令为
openssl s_client -host 192.168.3.129 -port 8739 -CAfile at_server_ca/rsa-ca.crt -verify 1
-
确认服务器没有问题后,查看操作步骤是否正确。从 log 信息中,我们可以看到并未生成新的证书 bin ,也并未加载新的证书 bin。将 CA 证书更新到 Flash 中, 指令如下:
AT+SYSFLASH=0,"client_ca",0,4096
AT+SYSFLASH=1,"client_ca",0,1424
-
还需要注意在认证之前加上
AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"
这条指令,因为SSL 认证连接需要校验服务器端的证书,所以需要连接 sntp 来获取当前时间,用来判断证书是否过期 -
如果以上步骤均正确, ssl 连接依然失败,就需要通过抓包进一步查看了。可参考 Wireshark 抓包指南。