OpenSSL验证SSL证书报unexpected eof while reading错误求助
报错原因
两个报错属于因果连带关系,根因是证书部署逻辑错误:
- 你当前仅生成了自签名根CA证书,没有签发对应域名的服务端终端证书,并且直接把根CA证书部署到了
serv.org.com:3002的服务上。TLS证书校验的标准逻辑要求:服务端返回的证书链最末端必须是终端实体证书(不能是CA根证书),根证书应该作为信任锚存在于客户端本地,而不是通过握手链路传输。因此OpenSSL校验时抛出错误码19:self-signed certificate in certificate chain。 - 后续抛出的
unexpected eof while reading是衍生错误:证书校验失败后TLS握手异常终止,OpenSSL等待后续握手报文时收到了连接断开的信号,就会触发该EOF报错,本身不是故障根因。
解决方法
分两种场景处理:
场景1:生产/正式环境使用(推荐CA层级部署)
保留已生成的CA私钥和根证书,按以下步骤签发服务端专用证书:
- 生成服务端域名私钥
openssl genrsa -out serv.org.com.key 2048 - 生成服务端证书签名请求(CSR),注意CN字段必须和访问域名完全匹配
openssl req -new -key serv.org.com.key -out serv.org.com.csr -subj "/O=Org/CN=serv.org.com" -sha256 - 用根CA签发服务端证书,可根据需求调整
-days参数修改有效期openssl x509 -passin "pass:rootPassword" -req -days 365 -in serv.org.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out serv.org.com.crt -sha256 - 修改3002端口对应服务的SSL配置:
- 证书路径配置为新生成的
serv.org.com.crt - 私钥路径配置为新生成的
serv.org.com.key
严禁将根CA私钥ca.key部署到服务端,否则会导致整个CA信任体系泄露
- 证书路径配置为新生成的
- 重启服务后重新执行原验证命令即可通过校验。
场景2:临时测试使用(单自签名证书部署)
如果不需要搭建CA层级,仅做临时功能测试,不需要重新生成证书,直接在验证命令中增加-partial_chain参数,允许OpenSSL将传入的自签名证书直接作为信任锚即可:openssl s_client -connect serv.org.com:3002 --quiet -CAfile C:\Certs\ca.crt -partial_chain
注意:该方式不符合TLS证书标准部署规范,仅可用于临时测试,禁止在生产环境使用。
内容的提问来源于stack exchange,提问作者Cora Kwok
相关产品推荐
相关产品推荐

