Traefik TLS 证书导致 curl 中出现"unknown CA"错误,可在浏览器中工作



我得到了以下文件,用于为在域名example.com上运行的网站设置TLS:

  • example.com.key(含私钥)
  • example.com.cer(含一证书)
  • intermediate_example.com.crt(含两个证书)
  • example.com.csr(包含一个证书请求)

我使用Traefik来托管网站,我已经在dynamic.yml配置中配置了Traefik:

tls:
certificates:
- certFile: "certs/example.com.cer"
keyFile: "certs/example.com.key"
stores:
- default

这样做导致我可以通过Chrome和Firefox访问一个网站,但每当尝试用curl(或任何使用其库的程序)请求时,我得到以下错误:

➜  ~ curl -v https://test.example.com/
*   Trying xxx.xxx.xxx.xxx:443...
* Connected to test.example.com (xxx.xxx.xxx.xxx) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

为什么这在浏览器中工作,而不是通过curl?

我已经确保主机上安装了ca-certificates包,即使我下载了最新的CA包并使用curl --cacert cacert.pem …,它也不能工作。

我在这里错过了什么?

不工作的原因是Traefik发送给客户端的中间证书缺失。

浏览器可以使用权限信息访问机制来解决这个问题,甚至macOS也这样做,在带外获取丢失的信息,从而允许您正常访问站点。这里给出一些背景。

这显然是服务器上的一个配置错误。为了修复它,至少对于Traefik来说,您可以将所有内容连接到一个.pem文件中。您不需要在这里添加CSR文件:

cat example.com.key example.com.cer intermediate_example.com.crt > cert.pem

然后,在Traefik的配置中指定相同的文件两次:

tls:
certificates:
- certFile: "certs/cert.pem"
keyFile: "certs/cert.pem"
stores:
- default

Traefik社区委员会的讨论中也提到了这一点。

相关内容

  • 没有找到相关文章

最新更新