这条消息说私钥长度不对,而这样的措辞先指向编码,然后才指向密码学。WireGuard 的密钥把 32 字节编码为 base64,连同末尾填充共 44 个字符,所以尺寸不同的值无论看起来多么随机都不是密钥。一直补齐字符串直到解析器接受,只会得到一个格式正确、却没有任何对端能认出的值。

这个错误背后是两件不同的事:修复一个有效密钥的文本,以及替换一个你已经不再掌握的身份。两者后果不同,而且其中一件会让另一端点失效。

解析器期待什么

一个 WireGuard 密钥是 base64 编码的 32 字节密钥材料,采用标准填充,因而得到固定的 44 字符字符串。工具会拒绝一切不能恰好解码为 32 字节的内容,因为底层曲线只接受 32 字节的标量,别的一概不要。公钥和私钥使用同一种编码,所以解析器仅凭格式无法分辨你粘贴的是哪一种。围绕这个错误的困惑,有一半来自这种歧义。

wg genkey | tee private.key | wg pubkey > public.key
base64 -d private.key | wc -c
wc -c private.key
wg show wg0 public-key

如果你的值能解码为 32 字节,长度就是对的,报错来自文件的其他地方。如果解码出来更短,那是材料被截断,而不是格式问题。

格式损坏还是材料不对?

格式损坏集中在边缘:shell 加上的引号、跟着值一起被复制的 private_key 之类的标签、聊天客户端插入的换行,以及粘贴时留下的行尾空格。这些改动只改字符串不改字节,所以去掉它们就能恢复原来的身份。请逐字符地把文件与配置记录对照,而不是一直删标点直到解析器不再报错。

材料不对是另一种情况。密码、证书密钥或公钥值都可能看似合理,却解码出错误的尺寸。无论怎么清理,都变不成对端期待的那个标量。这种情况需要新身份,而不是编辑。

私钥字段里放了公钥

最常见的混淆是把公钥值粘进私钥字段,或者反过来。两者都是 32 字节的合法 base64,所以长度检查会通过,握手则会在之后失败,却不给出有用的信息。私钥是生成公钥的那个标量,所以可以推导出公钥值,再与对端授权的值比较来确定。推导结果与记录不符时,你手里的是错误身份,而不是笔误。

只替换客户端的私钥却不更新远端的授权公钥,会重新制造同样的不匹配,还多了一层迷惑:客户端自己的文件看起来自洽了。请在一次操作里同时改动两端,否则下一个人会在错误的一半上排查。

修好配置,然后证明握手可用

当密钥解码出正确尺寸并与授权对匹配后,剩下的工作就是配置和路由。下面的命令会在需要时生成新的一对,验证现有密钥的解码尺寸,并读取接口实际使用的公钥值。永远不要把私钥值粘进工单或解码网站。

wg genkey | tee new.key | wg pubkey > new.pub
base64 -d private.key | wc -c
ip route get 10.60.9.5
wg show wg0 latest-handshakes

尺寸检查回答材料是否具有密钥的形状,路由查询回答数据包是否真能到达接口。两项检查都通过之后握手行仍为空,就把诊断转移到对端端点和允许的地址。最后再对照配置记录读一遍接口公钥,因为过时的已保存配置可能看起来正确,而实际生效的那份并不相同]。

记下你替换了哪个值、授权副本存放在哪里。下一个接触这个对端的人需要知道改的是哪一端。

相关文章