SSL === 作者:闫国梁 最后修改时间:2020年8月11日 关键词:\ **SSL,加密,TLS,证书** 1 概述 ------ **为什么需要SSL** 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。 > (1) 窃听风险(eavesdropping):第三方可以获知通信内容。 > (2) 篡改风险(tampering):第三方可以修改通信内容。 > (3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。 SSL/TLS协议是为了解决这三大风险而设计的,希望达到: > (1) 所有信息都是加密传播,第三方无法窃听。 > (2) 具有校验机制,一旦被篡改,通信双方会立刻发现。 > (3) 配备身份证书,防止身份被冒充。 总而言之,SSL就是为了数据安全。 ## 2 相关AT指令介绍 ## 2.1 设置TCP 使用SSL 功能:AT+CIPSSL +-----+--------------------------------------------------+------------+ | 命 | 语法 | 返回 | | 令 | | | | 类 | | | | 型 | | | +=====+==================================================+============+ | 设 | AT+CIPSSL= | OK | | 置 | | | | 命 | | | | 令 | | | +-----+--------------------------------------------------+------------+ | 查 | AT+CIPSSL? | +CIPSSL: | | 询 | | OK | | 命 | | | | 令 | | | +-----+--------------------------------------------------+------------+ | 测 | AT+CIPSSL=? | +CIPSSL: | | 试 | | (0-1)OK | | 命 | | | | 令 | | | +-----+--------------------------------------------------+------------+ | 注 | 在 CIPSTART 之前输入设置命令 AT+CIPSSL=1 来打开 | | | 意 | SSL 功能。打开 SSL 功能后,模块会在 TCP | | | 事 | 连接建立后自动进行 SSL 验证。当前仅支持作为 SSL | | | 项 | Client 应用。 | | +-----+--------------------------------------------------+------------+ 参数定义: ==== ============ ==== ============ 参数 定义 取值 对取值的说明 ==== ============ ==== ============ \ SSL 功能开关 0 关闭 SSL \ 1 打开 SSL ==== ============ ==== ============ 2.2 配置 TCP SSL 参数:AT+SSLCFG -------------------------------- 设置命令用来设置 SSL 版本,SSL 加密算法(ciphersuites),安全等级(security level),CA 证书(Certificate Authority Certificate),客户端证书(client certificate)和客户端密钥(client key)。这些参数在 SSL 协议的握手过程中会用到。语法规则: +---+-----------------------------+-----------------------------------+ | 命 | 语法 | 返回 | | 令 | | | | 类 | | | | 型 | | | +===+=============================+===================================+ | 设 | AT+SSLCFG=“sslversion”,[,] | **如果缺失,则查询对应的SSL版本: | | 置 | | +SSLCFG:** “sslversion”,, OK | | 命 | | **否则,设置对应的SSL版本:** | | 令 | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“ciphersuite”,[,] | **如 | | | | 果缺失,则查询对应的加密算法:** | | | | +SSLCFG: ciphersuite",, OK | | | | **否则,设置 对应的加密算法:** | | | | 如果格式和参数正确,返回: OK | | | | 如果目录格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“cacert”,[,] | **如果 参数缺失,则查询 对应的 CA | | | | 证书路径:** +SSLCFG:“cacert”,, | | | | OK **否则,设置 对应的 CA | | | | 证书路径:** | | | | 如果格式和参数正确,返回: OK | | | | 如果目录格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“clientcert”,[,] | **如果 参数缺失,则是查询 | | | | 对应的客户端证书路径:** | | | | +SSLCFG:“clientcert”,, OK | | | | **否则,设置 | | | | 对应的客户端证书路径:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“clientkey”,[,] | **如果 缺失,则是查询 | | | | 对应的客户端密钥路径:** | | | | +SSLCFG:“clientkey”,, OK | | | | **否则,设置 | | | | 对应的客户端密钥路径:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“seclevel”,[,] | **如果 参数缺失,则是查询 | | | | 相关的安全等级 :** | | | | +SSLCFG:“seclevel”,, OK | | | | **否则,设置 对应的安全等级:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“hostname”,[,] | **如果 参数缺失,则是查询 | | | | 相关的域名:** | | | | +SSLCFG:“hostname”,, OK | | | | **否则,设置 对应的主机名:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+S | **如果 缺失,则是查询 | | | SLCFG=“ignorelocaltime”,[,] | 相关 | | | | 的证书过期时间检查这项的设置:** | | | | +SSLCFG:“ignorelocaltime”,, OK | | | | **否则,设置 | | | | 对应的证书过期时间检查参数:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SS | **如果 参数缺失,则是查询 | | | LCFG=“negotiatetimeout”,[,] | 对应的最大 SSL 协商时间:** | | | | +SSLCFG:“negotiatetimeout”,, OK | | | | **否则,设置 对应的最大 SSL | | | | 写上协商时间:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | A | **如果 缺失,则是查询 | | | T+SSLCFG=“clientrandom”,[,] | 相关的随机数 :** | | | | +SSLCFG:“clientrandom”,, OK | | | | **否则,设置 对应的随机数:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“premaster”,[,] | **如果 缺失,则是查询 相关的 :** | | | | +SSLCFG:“premaster”,, OK | | | | **否则,设置 对应的 premaster | | | | :** 如果格式和参数正确,返回: | | | | OK 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=“verifymode”,[,] | **如果 缺失,则查询 | | | | 相关的证书验证模式,此时返回:** | | | | +SSLCFG:" verifymode",, OK | | | | **否则,设置证书认证模式 | | | | 是根证书认证还是其他证书认证:** | | | | 如果格式和参数正确,返回: OK | | | | 如果命令格式或参数错误,返回: | | | | ERROR | +---+-----------------------------+-----------------------------------+ | | AT+SSLCFG=”XXXXX”,, | 擦除相应的 | | | | 参数。”XXXXX”是指:“sslversion”, | | | | “ciphersuite”,“cacert”等关键字。 | | | | **注意: 后一定要有逗号,如果 | | | | 后面没有逗号,则只是查询。** | +---+-----------------------------+-----------------------------------+ | 测 | AT+SSLCFG=? | OK | | 试 | | | | 命 | | | | 令 | | | +---+-----------------------------+-----------------------------------+ | 注 | TCP | | | 意 | SSL的功能示 | | | 事 | 例,请参考本章后面的例子。 | | | 项 | | | +---+-----------------------------+-----------------------------------+ 参数定义: +-------+------------------------+------+----------------------------+ | 参数 | 定义 | 取值 | 对取值的说明 | +=======+========================+======+============================+ | | SSL 上下文 id | 0 | 整数型。TCP 功能时与 | | | | ~5,3 | CIPSTART | | | | 4,88 | 中的绑定。例如:当多链接中 | | | | ,153 | CIPSTART 中设置链接号为 | | | | | 1,则SSL 上下文 id 也为 | | | | | 1。TCP 单链接中 SSL 上下文 | | | | | id 固定为 0.FTP | | | | | 功能时=34(十进制)MQTT | | | | | 功能时=88(十进制)HTTP | | | | | 功能时=153(十进制) | +-------+------------------------+------+----------------------------+ | | SSL 版本 | 0 | SSL3.0 | +-------+------------------------+------+----------------------------+ | | | 1 | TLS1.0 | +-------+------------------------+------+----------------------------+ | | | 2 | TLS1.1 | +-------+------------------------+------+----------------------------+ | | | 3 | TLS1.12 | +-------+------------------------+------+----------------------------+ | | | 4 | ALL above | +-------+------------------------+------+----------------------------+ | | SSL ciphersuites | 0X | TL | | | | 0035 | S_RSA_WITH_AES_256_CBC_SHA | +-------+------------------------+------+----------------------------+ | | | 0X | TL | | | | 002F | S_RSA_WITH_AES_128_CBC_SHA | +-------+------------------------+------+----------------------------+ | | | 0X | TLS_RSA_WITH_RC4_128_SHA | | | | 0005 | | +-------+------------------------+------+----------------------------+ | | | 0X | TLS_RSA_WITH_RC4_128_MD5 | | | | 0004 | | +-------+------------------------+------+----------------------------+ | | | 0X | TLS | | | | 000A | _RSA_WITH_3DES_EDE_CBC_SHA | +-------+------------------------+------+----------------------------+ | | | 0X | TLS_R | | | | 003D | SA_WITH_AES_256_CBC_SHA256 | +-------+------------------------+------+----------------------------+ | | | 0X | ALL above | | | | FFFF | | +-------+------------------------+------+----------------------------+ | | 被信任的 CA 证书路径 | | 字符串型 | +-------+------------------------+------+----------------------------+ | | 客户端证书路径 | | 字符串型 | +-------+------------------------+------+----------------------------+ | | 客户端密钥路径 | | 字符串型 | +-------+------------------------+------+----------------------------+ | | 安全等级 | 0 | No authentication | +-------+------------------------+------+----------------------------+ | | | 1 | 服务器鉴权 | +-------+------------------------+------+----------------------------+ | | | 2 | 服务器鉴权和客户端 | | | | | 鉴权(如果服务器要求的话) | +-------+------------------------+------+----------------------------+ | | 主机名 | | | +-------+------------------------+------+----------------------------+ | | 该参 | 0 | 关心证书的过期时间 | | | 数决定如何对待过期证书 | | | +-------+------------------------+------+----------------------------+ | | | 1 | 忽略证书的过期时间 | +-------+------------------------+------+----------------------------+ | | SSL 协商阶段的最大时间 | 10 | 单位:秒 | | | | ~300 | | +-------+------------------------+------+----------------------------+ | | 随机数,十六进 | 数字 | 字符串型 | | | 制数组成的字符串,支持 | 和字 | ,双引号可加可不加,数字的 | | | 56 和 64 个字节 | 母的 | 范围:0~9,字母的范围:AB | | | | 组合 | CDEF(大小写不敏感)。例如 | | | | | 56 | | | | | 个字节的:101B | | | | | 12C3141516171F192021222324 | | | | | 25262728293031323334353637 | +-------+------------------------+------+----------------------------+ | | premaster | | | +-------+------------------------+------+----------------------------+ | | 证书验证模式 | 0 | 根证书认证 | +-------+------------------------+------+----------------------------+ | | | 1 | 其他证书认证 | +-------+------------------------+------+----------------------------+ 3 AT指令示例 ------------ **实例说明:本实例演示模块做为客户端,单链接,发送数据,开启SSL功能(双向证书验证)** ## 3.1 连接网络 --------------- @[TOC] ### **3.1.1 开机** 通过拉低powerkey2秒进行开机,开机以后通过串口循环发送AT直到收到OK,如果90秒没有收到OK请拉低 RESET_IN_N 引脚 150ms 以上。或使用其他方法见\ `开关机 `__\ 章节 3.1.2 查询卡状态 ~~~~~~~~~~~~~~~~ **AT+CPIN?**\ 查询卡状态,直到收到+CPIN: READY,如果10s内没有收到建议重启模块 3.1.3 查询网络注册情况 ~~~~~~~~~~~~~~~~~~~~~~ **AT+CGATT?**\ 查询是否注册网络收到+CGATT: 1值是1即为注册成功,正常情况下注册时间不会超过两分钟,如果超过两分钟没有注册可以进入飞行模式五秒后退出再查询,或者直接重启模块。 3.1.4 配置连接 ~~~~~~~~~~~~~~ **AT+CIPMUX=0**\ 设置为单链接模式 **AT+CIPQSEND=1**\ 设置为快发 注意:这两条一定要在启用网络之前配置,不然会失败。 3.1.5 激活网络 ~~~~~~~~~~~~~~ **AT+CSTT**\ 配置网络,非私有APN以外Cat1的固件支持根据卡自动配置APN,直接输入AT+CSTT即可,模块会按照自动获取的APN设置CSTT的APN。 **AT+CIICR**\ 激活网络,在IP START的状态使用AT+CIICR激活网络,激活以后通过\ **AT+CIFSR**\ 查询是否获取IP,如果成功就可以开始配置TCP连接了,如果不成功使用AT+CIPSHUT关闭移动网络,从AT+CSTT重新进行。 .. _配置连接-1: 3.2 配置连接 ------------ **AT+CIPSSL=1** 开启SSL功能开关为开 **AT+FSCREATE=”server.crt”** 创建CA 证书文件 **AT+FSCREATE=”client.crt”**\ 创建客户端证书文件 **AT+FSCREATE=”client.key”**\ 创建客户端密钥文件 **AT+FSWRITE=”server.crt”,0,2080,15**\ 文件长度2080只是举例,要根据实际填写。下同。 **AT+FSWRITE=”client.crt”, 0,128,10**\ 输入客户端证书文件 **AT+FSWRITE=”client.key”,0,188,10**\ 输入客户端密钥文件 **AT+SSLCFG=”cacert”,0, ”server.crt”**\ 设置服务器CA 证书SSL 上下文id,在单链接的情况下缺省为0 **AT+SSLCFG=”clientcert”,0, ”client.crt”**\ 设置客户端证书 **AT+SSLCFG=”clientkey”, 0,”client.key”**\ 设置客户端KEY **AT+SSLCFG=”seclevel”,0,2**\ 设置安全等级 **AT+SSLCFG=”ciphersuite”,0,0X0035**\ 设置加密套件 **AT+SSLCFG=”clientrandom”,0,101B12C3141516171F19202122232425262728293031323334353637** 设置随机数 3.3 连接服务器 -------------- **AT+CIPSTART=TCP,tcplab.openluat.com,57513** 连接服务器,请使用自己服务器测试 **AT+CIPSEND=10**\ 发送数据(确定长度) **AT+CIPSHUT**\ 关闭连接 **AT+CIPSSL=0**\ 关闭SSL 4 相关资料以及购买链接 ---------------------- `《AT指令手册》 `__ 相关开发板购买链接 `Air724UG开发板 `__ `Air724 开发板使用说明 `__ 5 常见问题 ---------- - **连接服务器失败** 1. 服务器必须是公网地址 2. 使用PC上的TCP UDP测试工具客户端、或者mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障 3. 如果连接ssl服务器,确认下core文件是否支持ssl功能(例如2G模块的某些core文件不支持ssl功能) 4. 2G模块不要使用中国联通卡 5. 检查下模块信号、网络注册、网络附着、PDP激活状态 6. 检查下SIM卡是否欠费【4G模块有一种欠费表现:无法注册4G网络,可以注册2G网络】 - **最多同时支持多少个连接** AT版本最多8个连接 - **支持什么加密证书** 支持证书配置,支持单向认证和双向认证 支持如下六种加密套件: 0X0035 TLS_RSA_WITH_AES_256_CBC_SHA 0X002F TLS_RSA_WITH_AES_128_CBC_SHA 0X0005 TLS_RSA_WITH_RC4_128_SHA 0X0004 TLS_RSA_WITH_RC4_128_MD5 0X000A TLS_RSA_WITH_3DES_EDE_CBC_SHA 0X003D TLS_RSA_WITH_AES_256_CBC_SHA256