旧 php 容器说:curl: (60) SSL 证书问题:证书已过期

old php container says : curl: (60) SSL certificate problem: certificate has expired

自从 1 或 2 天以来,我的旧 php 容器 (dockerhub php:5.4-apache) 不能再使用 curl。 这是 运行 在此容器内卷曲时的日志。

$> docker run --rm -ti php:5.6-apache bash
$> curl -X POST https://xxxxx.com
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

同样的调用适用于现代(更新)OS。

原因是 os 的证书已过时

要更新它们,您需要执行以下操作

curl -k https://curl.se/ca/cacert.pem > cacert.pem
# works : curl --cacert cacert.pem -X POST https://xxxxx.com

apt-get install ca-certificates
openssl x509 -outform der -in cacert.pem -out cacert.crt
cp cacert.crt /usr/local/share/ca-certificates/
update-ca-certificates

其他选项:

sed -i 's/mozilla\/DST_Root_CA_X3.crt/!mozilla\/DST_Root_CA_X3.crt/g' /etc/ca-certificates.conf
update-ca-certificates

最佳选择(恕我直言):

apt-get update
apt-get upgrade -y

拉斐尔的回答有些正确。 我检查了 https://curl.se/ca/cacert.pem 文件,发现截至今天它包含 Digital Signature Trust Co. (DST Root CA X3) CA Root 证书。因此,如果它包含相同的过期证书,则替换您的根 CA 证书包可能不是答案。

不清楚您使用的是什么 cacert。 可以分享吗?

你没有提到 OS 是什么,所以我假设 Linux。

您可以隔离您的 OS CA 根证书位置并检查是否是您的某个过期证书的原因。

本文中的步骤对于 CA 根捆绑包(例如 https://curl.se/ca/cacert.pem)证书链中任何过期的 CA 根证书都是相同的。