这个坑值得记一笔。腾讯云 2 核 4G 的 Ubuntu 20.04,nginx 用内部 CA 签发的证书,Chrome 访问正常,iOS 16 的 Safari 提示此连接不安全,抓包看握手成功,但证书扩展里 extendedKeyUsage 只有 clientAuth。
刚开始盯着「OpenSSL 配置里根本没写 extendedKeyUsage 段」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。签发时 extendedKeyUsage 只写了 clientAuth,没有 serverAuth;误用了客户端证书模板去签服务端证书;证书被中间 CA 重签后扩展被覆盖。
动手时先确认证书的扩展用途
openssl x509 -in server.crt -noout -text | grep -A2 'Extended Key Usage'
准备带 serverAuth 的扩展文件
printf 'extendedKeyUsage=serverAuth\nkeyUsage=digitalSignature,keyEncipherment\n' > server.ext
接着用扩展文件重新签发证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 825 -extfile server.ext
部署后核对线上证书扩展
openssl x509 -in /etc/nginx/ssl/server.crt -noout -text | grep -A1 'Extended Key Usage'
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
别只看报错消失,验证要多做一步。扩展里出现 TLS Web Server Authentication,iOS 和 Chrome 都能正常打开,不再提示不安全。
提醒一点。服务端证书只需要 serverAuth,同时写 clientAuth 不会报错但会扩大用途,按最小权限签发更稳妥。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
