设备信任哪些 CA,是配置出来的。对端拿来的证书如果是由一个设备不认识的 CA 签发的,那这条链就验不下去。
这条测的就是这种情形。设备收到一张引用未知 CA 的证书,要报Alarm: certificate validation: CA certificate not available,关连接。
怎么造
需要两套 CA。一套是设备信任的ca,用来签服务器证书和正常客户端证书;另一套是设备不认识的other_ca,用它签一张客户端证书:
# 独立的自签 CA,设备不加载它openssl req-x509-newkeyrsa:2048-keyoutother_ca.key-outother_ca.crt\-days3650-nodes\-subj"/C=CN/O=OtherLab/CN=Other Root CA"# 用 other_ca 签一张客户端证书openssl req-newkeyrsa:2048-keyoutother_client.key-outother_client.csr-nodes\-subj"/C=CN/O=OtherLab/CN=Other CA Client"openssl x509-req-inother_client.csr-CAother_ca.crt-CAkeyother_ca.key\-CAcreateserial-outother_client.crt-days3650-sha256服务端只加载ca.crt,绝不加载other_ca.crt:
SSL_CTX_load_verify_locations(ctx,"certs_keys/ca.crt",NULL);跑测试
cdcerts_keys/# 基线:ca 签发的证书openssl s_client-connect127.0.0.1:19998-tls1_2\-certclient.crt-keyclient.key-CAfileca.crt# 测试:other_ca 签发的证书openssl s_client-connect127.0.0.1:19998-tls1_2\-certother_client.crt-keyother_client.key-CAfileca.crt判定
| 检查项 | 通过标准 |
|---|---|
| 基线(ca 签发) | 成功 |
| other_ca 签发 | 握手失败 |
| 安全事件 | Alarm: certificate validation: CA certificate not available |
| 连接 | 设备主动关闭 |
和 6.3.12 的区别
这两条经常被搞混,都是证书验证不过,但失败在哪一步不一样。6.3.11 是链的根都找不到,设备根本不认识签发者。6.3.12 是根找到了、链也验通了,但设备额外配了一层"只接受特定个体证书"的白名单,而对端不在名单里。
前者是 PKI 层面的事,后者是应用层策略的事。事件字符串也印证了这点:6.3.11 报的是CA certificate not available,6.3.12 报的是trusted individual certificate not available,一个说 CA 不可用,一个说个体证书不可用。
测的时候如果设备对这两条都报同一个事件,说明它没区分开这两种失败,需要留意。