Go 程序验证 X.509 证书遇阻:两字节差异引发验证难题
Go 程序验证 X.509 证书遇阻给出两个 X.509 证书一个是 CA 根证书另一个是由 CA 私钥签名的叶证书。用 openssl 工具验证叶证书是否由根证书私钥签名验证会通过。但编写 Go 程序验证时运行程序可能会出现 panic: x509: certificate signed by unknown authority 的输出。若使用另一个 CA 证书则会得到预期输出。两证书差异分析乍看两个 CA 证书相同用 openssl 查看内容输出也一样但比较字节会发现有两个字节的细微差别。在两个位置导致 Go 程序验证失败的证书有 0x13 字节验证成功的证书有 0x0c 字节。X.509 证书用 ASN.1 定义用 DER 编码通常进行 Base64 编码并以 PEM 文本文件形式存储传输。深入探究验证失败原因用 gdb 编译并单步执行程序最终找到失败根源。叶证书潜在父证书主题应与叶证书颁发者匹配但使用导致验证失败的 CA 证书时循环无迭代因比较用的是原始主题和颁发者的字面字节。检查叶证书中颁发者数据类型是 UTF8String与验证成功的 CA 证书匹配。相关讨论与影响Go 项目一直在讨论这种行为是否正确一些工具如 openssl 在验证证书时将字符串不同 ASN.1 数据类型视为等效使问题更复杂。叶证书有效期短工具发展可能导致新生成叶证书出现差异。Go 对这种情况的处理可能导致服务中断和停机了解证书生成和验证方式很重要。