更换服务器后Google SSO登录失败:无法获取验证证书
问题描述
近期将服务器从Contabo更换为one.com VPS后,Google SSO登录功能失效(Microsoft SSO可正常使用)。密钥、域名均未变更,本地登录也正常。调用以下代码时出现错误:
$userInfoResponse = Google::getUserInfo($tokenResponse->idToken); $authToken = AuthToken::findByIdentifierAndProvider($userInfoResponse->sub, EnumAuthTokenProvider::GOOGLE);
报错信息为:
"error":"Failed to retrieve verification certificates:
其中$tokenResponse有返回值,但$userInfoResponse无返回值。目前约14000名使用Google登录的学生无法登录,且Google Cloud Console设置未做任何更改。
排查方向与解决方案
服务器出站网络限制:one.com的VPS可能默认拦截了Google证书验证相关的HTTPS请求(如
https://www.googleapis.com/oauth2/v3/certs、https://accounts.google.com/.well-known/openid-configuration)。在服务器上执行以下命令测试连通性:curl -v https://www.googleapis.com/oauth2/v3/certs如果请求超时或返回错误,联系one.com客服开放对应域名的出站权限,或检查服务器本地防火墙/安全组规则是否阻断了这些请求。
PHP CA证书配置缺失:新服务器的PHP环境可能未正确配置CA根证书,导致无法验证Google的HTTPS证书链,进而无法拉取验证证书。
- 下载最新的CA证书文件(如cacert.pem)
- 修改
php.ini文件,设置:curl.cainfo = "/path/to/cacert.pem" openssl.cafile = "/path/to/cacert.pem" - 重启PHP-FPM或Web服务器生效。
系统时间偏差过大:服务器系统时间与标准时间偏差超过5分钟时,会导致Google ID Token的JWT验证失败(ID Token包含过期时间戳,时间偏差会触发有效性校验失败)。
- 执行
date命令查看服务器时间,对比实际标准时间 - 使用NTP服务同步时间,例如:
sudo apt-get install ntp sudo systemctl start ntp
- 执行
OAuth客户端库缓存问题:如果使用的Google OAuth客户端库存在证书缓存机制,新服务器上可能残留无效缓存。
- 清除库的缓存目录(具体路径取决于使用的库,例如Guzzle的缓存目录)
- 重启PHP服务强制库重新拉取最新的验证证书
透明代理拦截:one.com的VPS可能启用了透明代理,导致请求Google端点时被中间人拦截,证书验证失败。联系服务商确认是否存在这类网络配置,如有需要调整代理规则以允许正常访问Google OAuth相关端点。
内容的提问来源于stack exchange,提问作者Christophe Gratessolle

