ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

6.3.9 对端一个证书都不给

6.3.9 对端一个证书都不给

IEC 62351-3 要求双向认证,也就是服务端和客户端都得亮出证书。这条测的是客户端耍赖:握手过程中干脆一张证书都不提供。

设备要报Alarm: certificate unavailable,然后关连接。

场景本身很直接,但实现上有个容易疏忽的地方。TLS 握手里,服务器发了 CertificateRequest 之后,客户端可以选择回一个空的 Certificate 消息。协议上这是合法的,服务器必须自己检查"该来的证书没来",然后按违规处理。如果设备的 TLS 库默认配置里没有SSL_VERIFY_FAIL_IF_NO_PEER_CERT,它会放这个连接过去,那就错了。

服务端配置

关键是这一行:

SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,NULL);

SSL_VERIFY_PEER是要求对端出示证书,SSL_VERIFY_FAIL_IF_NO_PEER_CERT才是"没出示就失败"。少了后面这个标志,客户端不给证书也能握手成功,这条测例就白测了。

客户端怎么不给证书

最简单,命令里不带-cert和-key就行:

openssl s_client-connect127.0.0.1:19998-tls1_2-CAfileca.crt

基线还是先带证书连一次,确认环境是通的。

判定

检查项通过标准
基线(带证书)成功
不带证书握手失败
安全事件Alarm: certificate unavailable
连接设备主动关闭

和 6.3.28 是一对

6.3.28 是这条的重协商版本:第一次握手时正常给证书,等到重协商时再把证书清空。两条一起测,能看出设备在初始握手和重协商两个阶段有没有都做"证书必须存在"的检查。有的实现只在初始握手时检查,重协商时就放水了,只测 6.3.9 是看不出来的。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进