这个坑值得记一笔。内网 CentOS 7.9 用 openssl 自建 CA,给内部系统签了服务端证书,Windows 客户端导入根证书后访问仍报 unknown CA,openssl verify 直接报 unable to get issuer certificate,根证书和证书链都挂对了。
刚开始盯着「服务端证书的 issuer 和根证书 subject 不一致」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。自签根证书没写 basicConstraints=critical,CA:TRUE;缺 keyUsage=critical,keyCertSign,cRLSign;客户端只导入了服务端证书,没有导入根证书。
第一件事是看根证书的扩展项
openssl x509 -in ca.crt -noout -text | grep -A2 'Basic Constraints'
接着重新生成带 CA 标记的根证书
openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650 -subj '/CN=Corp Root CA' -addext 'basicConstraints=critical,CA:TRUE'
然后确认 keyUsage 里有签发权限
openssl x509 -in ca.crt -noout -text | grep -A1 'Key Usage'
末了用新根重签服务端证书并验证
openssl verify -CAfile ca.crt server.crt
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
改完先别撤,确认这几项。openssl verify 返回 OK,Windows 和浏览器都不再报 unknown CA,证书路径里能看到根证书。
容易忽略的是,已经发出去的旧证书没法补扩展,只能换根重签;换根前要把新根提前下发到所有客户端。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
