必须启用TLS或国密通道,channel模式需CAFile/Cert/Key三者齐全且匹配;smCrypto=true须同步设useGM=true并匹配gm私钥格式;NodeURL须带grpcs://或http://协议头;证书有效期与系统时间偏差超3分钟会导致TLS失败。

直接用 http 连接区块链节点等于把私钥、交易签名过程暴露在明文网络里——除非你确认节点跑在完全隔离的内网且无中间设备,否则必须启用 TLS 或国密通道。
channel 模式下 CAFile / Cert / Key 三者缺一不可
Go SDK 的 channel 连接模式强制走双向 TLS 认证,不是“配了就行”,而是三个文件必须同时存在且内容匹配:
-
CAFile必须是节点服务端所用 CA 根证书(不是中间证书),用于验证节点身份; -
Cert和Key是 SDK 自身的证书+私钥,由同一 CA 签发,节点会用 CA 公钥验签; - 常见错误:
tls: failed to verify certificate多因CAFile里混入了服务器证书链,或时间未同步导致证书过期; - 路径必须为绝对路径或相对于配置文件所在目录的相对路径,
./certs/ca.crt和certs/ca.crt在某些 SDK 版本行为不一致。
smCrypto = true 时 crypto.useGM 必须同步开启
国密支持不是开关式配置,而是一组强耦合参数。仅设 smCrypto = true 但漏掉 useGM = true,会导致 SDK 内部仍用 ECDSA 算法生成签名,节点拒绝交易:
-
[chain] smCrypto = true告诉 SDK “链用的是 SM2/SM3/SM4”,但不改变 SDK 默认算法; -
[crypto] useGM = true才真正切换 SDK 的哈希、签名、加解密实现为国密套件; -
[account] type = "gm"必须与keyFile中私钥格式匹配,pem 文件若含-----BEGIN EC PRIVATE KEY-----就不能标type = "gm"; - 错误现象:
invalid signature或verify signature failed,日志里看不到明显报错,需抓包看实际签名长度(SM2 签名约 128 字节,ECDSA 约 64 字节)。
NodeURL 不带协议头是常见低级失误
NodeURL = "127.0.0.1:20200" 看似合理,但多数 Go SDK(如 FISCO BCOS go-sdk)要求显式声明协议:
立即学习“go语言免费学习笔记(深入)”;
-
channel模式必须写成NodeURL = "grpcs://127.0.0.1:20200"(注意是grpcs,不是https); -
rpc模式必须写成NodeURL = "http://127.0.0.1:8545"或https://...; - 漏写协议头会导致连接超时而非报错,SDK 日志可能只显示
dial tcp: lookup 127.0.0.1: no such host,实际是解析失败; - 某些 SDK 对端口敏感:FISCO BCOS channel 默认用
20200,RPC 默认用8545,混用会静默失败。
最易被忽略的其实是证书有效期和系统时间偏差——哪怕只差 3 分钟,TLS 握手就会失败,而错误信息常被 SDK 吞掉,只留下模糊的 connection refused。建议在连接前加一行 date -R 校验,而不是反复检查配置项拼写。


















