Quickfix/go本地TLS配置:证书生成与证书错误问题排查
解决quickfix/go TLS连接的"tls: bad certificate"问题
错误根源
你的服务器证书仅用localhost作为Common Name(CN),但现代TLS协议要求证书必须包含**Subject Alternative Name(SAN)**字段来验证主机名,缺少该字段会触发验证失败,导致"bad certificate"错误。
修正后的证书生成流程
1. 配置easy-rsa支持SAN
克隆并进入easy-rsa目录后,复制默认配置模板并编辑:
git clone https://github.com/OpenVPN/easy-rsa.git example-ca cd example-ca/easyrsa3 cp vars.example vars
打开vars文件,修改并添加以下配置(取消对应行注释并调整值):
set_var EASYRSA_REQ_COUNTRY "CN" set_var EASYRSA_REQ_PROVINCE "Beijing" set_var EASYRSA_REQ_CITY "Beijing" set_var EASYRSA_REQ_ORG "YourOrg" set_var EASYRSA_REQ_EMAIL "admin@youorg.com" set_var EASYRSA_REQ_OU "FIXTesting" # 启用SAN并指定本地测试的主机名/IP set_var EASYRSA_ALT_NAME "DNS:localhost,DNS:127.0.0.1" set_var EASYRSA_SAN_ENABLE "yes"
2. 重新初始化PKI与CA
./easyrsa init-pki ./easyrsa build-ca nopass # 测试环境无需CA密码
3. 生成合规的服务器证书
./easyrsa build-server-full localhost nopass
此时生成的localhost.crt会包含DNS:localhost和DNS:127.0.0.1的SAN字段,满足TLS主机名验证要求。
4. 生成客户端证书
./easyrsa build-client-full client0 nopass
5. 提取证书文件
从以下路径复制所需文件到你的配置指定目录:
- 服务器证书/密钥:
pki/issued/localhost.crt、pki/private/localhost.key - 客户端证书/密钥:
pki/issued/client0.crt、pki/private/client0.key - CA根证书:
pki/ca.crt
验证证书有效性
执行以下命令检查服务器证书的SAN字段:
openssl x509 -in localhost.crt -text -noout | grep -A 3 "Subject Alternative Name"
输出需包含DNS:localhost, DNS:127.0.0.1,确认SAN配置生效。
同时确保所有证书文件权限正常,程序可读取(避免因权限问题导致证书加载失败)。
重新测试连接
替换原有证书后,重启quickfix/go的执行端与发起端,TLS握手即可正常完成,不再出现"tls: bad certificate"错误。
内容的提问来源于stack exchange,提问作者Atmo101
相关产品推荐
相关产品推荐

