Openssl证书验证规则是否比浏览器严格?报错21如何解决
问题根因
你的站点TLS配置存在证书链不完整问题:eye-n-sky.net服务端仅返回了站点本身的终端实体证书,未附带CA机构颁发的对应中间证书,OpenSSL作为底层工具默认不会主动拉取缺失的中间证书,无法将证书链向上追溯到本地信任的根CA,因此抛出21 (unable to verify the first certificate)错误。
浏览器可以正常访问的原因是大部分桌面浏览器内置了中间证书缓存,或是会主动从CA公开地址拉取缺失的中间证书补全链,属于浏览器的额外容错机制,并非OpenSSL的校验规则更严格。
你之前使用-CAfile参数指定根证书无法解决问题,是因为当前缺失的是中间证书而非根证书。
解决方案
你使用的是2.4.8以下版本的Apache服务,该版本不支持将中间证书和站点证书合并写入同一个服务端证书文件,需要单独配置证书链文件:
- 前往你申请证书的CA平台下载对应站点的中间证书链文件(通常为
.pem/.crt格式,文件名多带chain、bundle标识) - 编辑Apache站点的SSL配置文件,新增配置项:
SSLCertificateChainFile /你的证书存放路径/中间证书链文件名 - 执行命令验证Apache配置语法合法性:
apachectl configtest - 语法验证通过后重载Apache配置生效:
systemctl reload httpd
验证方式
配置生效后重新执行命令测试:openssl s_client -connect eye-n-sky.net:443
正常返回结果中的Verify return code会显示为0 (ok)。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

