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 是看不出来的。