具体问题:
PHP Fatal error: Uncaught GuzzleHttp\\Exception\\RequestException: cURL error 60: SSL certificate problem: certificate has expired (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)。
Curl openssl 返回 CURLE_PEER_FAILED_VERIFICATION 的原因是服务器的 SSL 证书无法验证。这可能是由于以下几种原因造成的:
- 服务器的 SSL 证书已过期或已吊销。
- 服务器的 SSL 证书颁发机构 (CA) 不受信任。
- 本地系统缺少必要的 CA 证书。
要解决此问题,可以尝试以下几种方法:
- 检查服务器的 SSL 证书是否有效。
- 将服务器的 CA 证书添加到本地系统信任库中。
- 禁用 SSL 证书验证。
检查服务器的 SSL 证书
可以使用 openssl 命令检查服务器的 SSL 证书。例如,要检查 https://www.google.com 的 SSL 证书,可以运行以下命令:
openssl s_client -connect www.google.com:443 -showcerts
如果服务器的 SSL 证书有效,则输出将显示证书的信息,包括颁发机构、有效期等。
将服务器的 CA 证书添加到本地系统信任库中
如果服务器的 SSL 证书是由受信任的 CA 颁发的,则可以将服务器的 CA 证书添加到本地系统信任库中。这将允许 curl 验证服务器的 SSL 证书。
在 Linux 系统上,可以使用以下命令将服务器的 CA 证书添加到本地系统信任库中:
sudo cp /path/to/ca.crt /etc/ssl/certs/ca-certificates.crt
在 Windows 系统上,可以使用以下命令将服务器的 CA 证书添加到本地系统信任库中:
certmgr.exe -add /s /r /c /n "CA Name" /f /path/to/ca.crt
禁用 SSL 证书验证
如果无法解决服务器的 SSL 证书问题,则可以禁用 SSL 证书验证。这将允许 curl 连接到服务器,但安全性会降低。
在 curl 命令中,可以使用以下选项禁用 SSL 证书验证:
--insecure
例如,要禁用 SSL 证书验证并连接到 https://www.google.com,可以运行以下命令:
curl --insecure https://www.google.com
注意:禁用 SSL 证书验证会降低安全性,应谨慎使用。
上述内容是解决方式,下文是我在项目中的实践:
项目中具体问题:
PHP Fatal error: Uncaught GuzzleHttp\\Exception\\RequestException: cURL error 60: SSL certificate problem: certificate has expired (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)。
解决方法:
查看curl报错 ,之后按照报错给的链接看了下步骤,查找 CURL 正在使用哪个 CA 证书包
# 引号内的url为你自己的网站链接
strace curl "url" |& grep open
在最后,看到证书包的地址(以自己服务器的情况为准): /etc/pki/tls/certs/ca-bundle.crt。
因为我本地CA证书太旧导致的,我重新下载了CA文件:下载地址,下载的文件是pem格式的,下文是转换为crt格式的方法:
PEM格式和CRT格式都是用于存储SSL证书的文件格式。PEM格式是文本格式,而CRT格式是二进制格式。
使用OpenSSL进行转换
可以使用OpenSSL命令将PEM格式转换为CRT格式。例如,要将名为server.pem的PEM格式证书转换为CRT格式,可以运行以下命令:
openssl x509 -in server.pem -out server.crt -outform DER
使用其他工具
也可以使用其他工具将PEM格式转换为CRT格式。例如,可以使用以下工具:
注意事项
- 转换PEM格式到CRT格式不会改变证书的内容。
- 转换后的CRT格式证书可以使用与PEM格式证书相同的用途。
转换完成后替换相应的证书就可以了,如果有报错相同的小伙伴可以参考:如何强制旧版 debian 忘记 DST Root CA X3 Expiration 并使用 ISRG Root X1 – SSL 证书问题:证书已过期 - 代码日志