3.1.2 SSL ========= 作者:闫国梁 最后修改时间:2020年6月23日 ## SSL 为什么需要SSL ------------- 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。 > (1) 窃听风险(eavesdropping):第三方可以获知通信内容。 > (2) 篡改风险(tampering):第三方可以修改通信内容。 > (3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。 SSL/TLS协议是为了解决这三大风险而设计的,希望达到: > (1) 所有信息都是加密传播,第三方无法窃听。 > (2) 具有校验机制,一旦被篡改,通信双方会立刻发现。 > (3) 配备身份证书,防止身份被冒充。 总而言之,SSL就是为了数据安全。 ## AT模式使用SSL ## 设置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 ==== ============ ==== ============ 配置 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: | | | | c | | | | iphersuite",,OK否则,设 | | | | 置\ ****\ 对应的加密算 | | | | 法:如果格式和参数正确 | | | | ,返回:OK如果目录格式 | | | | 或参数错误,返回:ERROR | | +------------------+-------------------------+-------------------------+ | AT+SSL | 如果\ ** | | | CFG=“cacert”,[,] | **\ 参数缺失,则查询\ * | | | | ***\ 对应的\ **CA**\ 证 | | | | 书路径:+SSLCFG:“cacer | | | | t”,,OK否则,设置\ ****\ | | | | 对应的\ **CA**\ 证书路 | | | | 径:如果格式和参数正确 | | | | ,返回:OK如果目录格式 | | | | 或参数错误,返回:ERROR | | +------------------+-------------------------+-------------------------+ +---------------------+-----------------------+-----------------------+ | | AT+SSLCFG= | 如果 | | | “ignorelocaltime”,[,] | \ ****\ 缺失,则是查 | | | | 询\ ****\ 相关的证书 | | | | 过期时间检查这项的设 | | | | 置:+SSLCFG:“ignorel | | | | ocaltime”,,OK否则,设 | | | | 置\ ****\ 对应的证书 | | | | 过期时间检查参数:如 | | | | 果格式和参数正确,返 | | | | 回:OK如果命令格式或 | | | | 参数错误,返回:ERROR | +=====================+=======================+=======================+ | AT+SSLCFG=“ne | 如果\ * | | | gotiatetimeout”,[,] | ***\ 参数缺失,则是查 | | | | 询\ ****\ 对应的最大\ | | | | **SSL**\ 协商时间:+ | | | | SSLCFG:“negotiatetime | | | | out”,,OK否则,设置\ * | | | | ***\ 对应的最大\ **SS | | | | L**\ 写上协商时间:如 | | | | 果格式和参数正确,返 | | | | 回:OK如果命令格式或 | | | | 参数错误,返回:ERROR | | +---------------------+-----------------------+-----------------------+ | AT+SSLC | 如果\ | | | FG=“clientrandom”,, | ****\ 缺失,则是查询 | | | | \ ****\ 相关的随机数 | | | | :+SSLCFG:“clientran | | | | dom”,,OK否则,设置\ * | | | | ***\ 对应的随机数:如 | | | | 果格式和参数正确,返 | | | | 回:OK如果命令格式或 | | | | 参数错误,返回:ERROR | | +---------------------+-----------------------+-----------------------+ | AT+S | 如果\ **** | | | SLCFG=“premaster”,, | \ 缺失,则是查询\ *** | | | | *\ 相关的\ ****\ :+S | | | | SLCFG:“premaster”,,OK | | | | 否则 | | | | ,设置\ ****\ 对应的 | | | | \ **premaster**\ :如 | | | | 果格式和参数正确,返 | | | | 回:OK如果命令格式或 | | | | 参数错误,返回:ERROR | | +---------------------+-----------------------+-----------------------+ | | AT+ | 如果\ ** | | | SSLCFG=“verifymode”,, | **\ 缺失,则查询\ *** | | | | *\ 相关的证书验证模式 | | | | ,此时返回:+SSLCFG:" | | | | verifymo | | | | de",,OK否则,设置证书 | | | | 认证模式是根证书认证 | | | | 还是其他证书认证:如 | | | | 果格式和参数正确,返 | | | | 回:OK如果命令格式或 | | | | 参数错误,返回:ERROR | +---------------------+-----------------------+-----------------------+ | AT+SSLCFG=”XXXXX”,, | 擦 | | | | 除相应的参数。”XXXXX | | | | ”是指:“sslversion”, | | | | “ciphersuite”,“cac | | | | ert”等关键字。注意:\ | | | | ****\ 后一定要有逗号 | | | | ,如果\ ****\ 后面没 | | | | 有逗号,则只是查询。 | | +---------------------+-----------------------+-----------------------+ | 测试命令 | AT+SSLCFG=? | +SSLCFG: | | | | “sslv | | | | ersion”,(0-5),(0-4)+S | | | | SLCFG:“ciphersuite”,( | | | | 0-5),(0X0035,0X002F,0 | | | | X0005,0X0004,0X000A,0 | | | | X003D,0XFFFF)+SSLCFG: | | | | “c | | | | acert”,(0-5),+SSLCFG: | | | | “clien | | | | tcert”,(0-5),+SSLCFG: | | | | “clie | | | | ntkey”,(0-5),+SSLCFG: | | | | “seclevel | | | | ”,(0-5),(0-2)+SSLCFG: | | | | “ignorelocaltime | | | | ”,(0-5),(0,1)+SSLCFG: | | | | “negotiatet | | | | ime”,(0-5),(10-300)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 | +-------+------------------------+------+----------------------------+ | 0 | TLS_RS | | | | X002F | A_WITH_AES_128_CBC_SHA | | | +-------+------------------------+------+----------------------------+ | 0 | TL | | | | X0005 | S_RSA_WITH_RC4_128_SHA | | | +-------+------------------------+------+----------------------------+ | 0 | TL | | | | X0004 | S_RSA_WITH_RC4_128_MD5 | | | +-------+------------------------+------+----------------------------+ | 0 | TLS_RSA | | | | X000A | _WITH_3DES_EDE_CBC_SHA | | | +-------+------------------------+------+----------------------------+ | 0 | TLS_RSA_W | | | | X003D | ITH_AES_256_CBC_SHA256 | | | +-------+------------------------+------+----------------------------+ | 0 | ALL above | | | | XFFFF | | | | +-------+------------------------+------+----------------------------+ | | 被信任的 CA 证书路径 | | 字符串型 | +-------+------------------------+------+----------------------------+ | | 客户端证书路径 | | 字符串型 | +-------+------------------------+------+----------------------------+ | | 客户端密钥路径 | | 字符串型 | +-------+------------------------+------+----------------------------+ | | 安全等级 | 0 | No authentication | +-------+------------------------+------+----------------------------+ | 1 | 服务器鉴权 | | | +-------+------------------------+------+----------------------------+ | 2 | 服务器鉴权和客户端鉴权 | | | | | (如果服务器要求的话) | | | +-------+------------------------+------+----------------------------+ | | 主机名 | | | +-------+------------------------+------+----------------------------+ | | 该参 | 0 | 关心证书的过期时间 | | | 数决定如何对待过期证书 | | | +-------+------------------------+------+----------------------------+ | 1 | 忽略证书的过期时间 | | | +-------+------------------------+------+----------------------------+ | | SSL 协商阶段的最大时间 | 10 | 单位:秒 | | | | ~300 | | +-------+------------------------+------+----------------------------+ | | 随机数,十六进 | 数字 | 字符串型 | | | 制数组成的字符串,支持 | 和字 | ,双引号可加可不加,数字的 | | | 56 和 64 个字节 | 母的 | 范围:0~9,字母的范围:AB | | | | 组合 | CDEF(大小写不敏感)。例如 | | | | | 56 | | | | | 个字节的:101B | | | | | 12C3141516171F192021222324 | | | | | 25262728293031323334353637 | +-------+------------------------+------+----------------------------+ | | premaster | | | +-------+------------------------+------+----------------------------+ | | 证书验证模式 | 0 | 根证书认证 | +-------+------------------------+------+----------------------------+ | 1 | 其他证书认证 | | | +-------+------------------------+------+----------------------------+ 具体使用方法可见最佳实践章节。 LUAT模式 -------- luat开发模式下SSL的使用表现在具体应用层的接口,主要是HTTP,MQTT和SOCKET相关部分。以SOCKET为例: **socket.tcp(ssl, cert)** 创建基于TCP的socket对象 - 参数 - +---------+------------------------------------------------------------+ | 传入 | 释义 | | 值类型 | | +=========+============================================================+ | bool | **可选参数,默认为 | | | \ ``nil``**\ ,ssl,是否为ssl连接,true表示是,其余表示否 | +---------+------------------------------------------------------------+ | table | **可选参数,默认为\ ``nil``**\ ,cert,ssl连接需要的证书 | | | 配置,只有ssl参数为true时,才参数才有意义,cert格式如下: | | | { caCert = “ca.crt”, –CA证书文件(Base64编码 | | | X.509格式),如果存在此 | | | 参数,则表示客户端会对服务器的证书进行校验;不存在则不校验 | | | clientCert = “client.crt”, –客户端证书文件(Base64编码 | | | X.509格式),服务器对客户端的证书进行校验时会用到此参数 | | | clientKey = “client.key”, –客户端私钥文件(Base64编码 | | | X.509格式) clientPassword = “123456”, | | | –客户端证书文件密码[可选] } | +---------+------------------------------------------------------------+ 使用ssl的时候配置第一个参数为true即可,第二个参数使用非对称密钥时可以不传,模块会使用内置的正式连接,当需要使用私有证书时,将证书和私钥与脚本放在同一目录一起下载即可。可参考demo的socketssl文件夹的脚本。