你的工单说证书是 SHA-256,网关日志却写着另一种签名算法,而且已经有人起草了重新签发 CA 的申请。在这份申请送出之前,请先把两个签名分开:一个是签发者对公钥盖下的印章,另一个是 对端在 IKE_AUTH 中证明自己持有匹配私钥。两者由不同的部件选择,也允许彼此不同。从各自所在的位置读取它们,只需要两条命令和一张表。

从证书中读取签发者的签名

CA 把自己的签名加在身份与密钥的绑定之上。这个签名记录的是 CA 在签发时做了什么,而不是主体在连接时会做什么,因此它的算法描述的是 CA 自己对哈希与密钥的选择。某类主体密钥完全可以落在另一类 CA 密钥之下,两者并不矛盾;CA 密钥轮换属于日常操作,而不是故障。读这两个字段,你就拿到了清点工作的一半:

openssl x509 -in peer.pem -noout -text | grep -E "Signature Algorithm|Public Key Algorithm"

把这两个标签分别记为独立条目。第一个描述 CA,第二个描述主体的密钥,两者都不能预测在线签名。

从 IKE 交换中读取在线签名

在认证过程中,每个对端用自己的私钥为交换数据签名,对侧则依据证书的身份、信任链与策略核验这份证明。对 RSA 而言,填充与哈希都属于这套在线方案,所以更长的密钥或崭新的 SHA-256 证书本身并不能为认证签名选择 RSA-PSS。协商出的方法会出现在守护进程日志或连接列表中,绝不会出现在证书里。要分别询问两端协商了什么,因为两个方向可以不同。

ipsec statusall | grep -i "auth\|proposal"

当一端说出另一端无法产生的方案时,你就找到了工单所指的那个不一致。重新签发 CA 是错误的修复方式,因为出问题的从来不是证书。

RFC 7427 改变了什么,又没有改变什么

原始方法在 RFC 7296 中按算法组合编号。后来的 RFC 7427 签名扩展 增加了一种通用的 Digital Signature 方法,并带有签名哈希支持的通告,因此新的哈希不必再占用一个方法号。这是协商出来的,而不是假定的:对端不会因为自己的库能解析同样的证书就获得该扩展;只实现原始方法的对端,会迫使网关保留其中一种。这是带有兼容性代价的策略取舍,而不是缺陷。

支持情况按方向、按连接而定,所以请测试眼前的这个构建,而不是相信某个产品系列的声明。三年前写下的能力矩阵,描述的是三年前的构建。

在清单里写下四行

终结争论的记录有四行,每一行来自不同的位置,也由不同的人修改。在做任何决定之前先把它填好,因为真正出错的那一行才决定该修什么。

对象从哪里读取由谁修改
证书签发者的签名证书的 Signature Algorithm 字段CA 运维人员,签发时
主体的公钥证书的 Public Key Algorithm 字段生成主体密钥的人
IKE 认证方案守护进程日志或连接列表,auth 与 signature-hash 通告两端对等体上的 IKE 配置
IKE 与 ESP 保护算法连接的提议列表IPsec 配置,按方向

每一行都带有各自的兼容性后果。更换 ESP 加密算法不会改变签发者的签名,放松 CA 校验也不会凭空增加对端从未协商过的在线方法。当工单声称签名不一致时,真正出错的那一行几乎从来不是第一行。

在不削弱 PKI 的前提下处理遗留情形

较旧的对端可能只提供你策略已不允许的方案。选项是为其设置有时限的兼容性例外、更新客户端,或只针对该对端改用另一种认证安排。围绕更弱的证书签名重建 PKI 并不能修复在线交换中的限制,还会削弱所有信任同一 CA 的其他服务。请记录你改了哪一行,以及例外何时到期。

然后从头再跑一遍那两项读取,因为一行的改动可能改变另一行协商出的结果。整份清单不过两条命令和一张表,无论对端是路由器、笔记本电脑还是设备,工作都一样。

相关文章