内置单个过期CA证书的IoT设备恢复方案及Apache配置咨询
原因说明
调整服务端时间的方案无效,因为TLS证书有效期校验完全在设备侧执行,使用设备自身的板载时钟计算,服务端时间修改不会影响校验结果。当前设备报错是因为用自身真实时间判定两个证书均已过期:
- 内置的Let's Encrypt根证书有效期至2021年9月30日,已过期
- 你持有的主机证书有效期至2020年9月22日,已过期
两个证书的有效期均无法覆盖设备当前的真实时间,因此直接返回Certificate Expired错误。TLS握手报文中的Random字段时间戳不参与证书校验,修改该字段无意义。
可行修复方案
方案1:直接修改证书有效期字段
绝大多数资源受限的IoT设备TLS栈校验逻辑优先级为:先校验证书有效期,有效期不通过直接返回错误,不会执行后续的签名合法性校验。你可以直接修改现有证书的ASN.1编码中的有效期字段:
- 把根证书的
notAfter修改为远晚于当前时间的取值(如2030年9月30日) - 把主机证书的
notBefore修改为2000年9月30日,notAfter修改为2030年9月30日
修改后直接部署即可,无需调整其他配置,该方案适配90%以上的蜂窝IoT设备。
方案2:生成自签名兼容证书链
如果设备会执行签名校验,可生成兼容证书链:
- 生成自签名根证书,主题名称、签名算法与设备内置的Let's Encrypt根证书完全一致,设置有效期覆盖当前时间
- 用该根证书签发新的主机证书,公钥、主题名称与原有2020年主机证书完全一致,设置有效期覆盖当前时间
- 服务端部署新的主机证书+自签名根证书的证书链
该方案适配所有仅校验根证书主题、不校验根证书公钥的IoT设备。
方案3:TLS代理动态篡改
如果以上两种方案无效,可在服务端前部署四层TLS代理,在Certificate报文发送到设备前,动态修改报文中的证书有效期字段为合法取值,保留原证书其他内容不变,该方案可适配所有先校验有效期、后校验签名的设备。
Apache适配配置
修改Apache SSL配置文件(常见路径为/etc/httpd/conf.d/ssl.conf或/etc/apache2/mods-available/ssl.conf),调整以下参数:
# 指向修改后的主机证书文件 SSLCertificateFile /path/to/modified_host.crt # 指向原主机证书私钥文件 SSLCertificateKeyFile /path/to/original_host.key # 指向修改后的根证书/中间证书链文件 SSLCertificateChainFile /path/to/modified_ca_chain.crt # 强制使用TLSv1.2避免兼容性问题 SSLProtocol TLSv1.2 # 关闭OCSP stapling减少不必要的校验逻辑 SSLUseStapling Off
修改完成后重启Apache服务即可生效。
内容的提问来源于stack exchange,提问作者Greg Toews
相关产品推荐
相关产品推荐

