我得到了以下文件,用于为在域名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社区委员会的讨论中也提到了这一点。