ingress-nginx 启用 tls 加密,配置了不存在的证书,导致 unable to get local issuer certificate

Tags: kubernetes_problem 

本篇目录

说明

一个特别低级的错误,浪费了我很多时间,找出原因后,哭笑不得。

在执行 ingress-nginx 的认证功能使用示例 中的操作时遇到的问题。

现象

用 curl 访问一个用自制 ca 签署的证书的网址,curl 提示找不到 ca,即使用 –cacert 指定了也不行:

$ curl  --cacert  ca.crt  -H "Host: auth-cert.echo.example" https://192.168.99.100:30358/
curl: (60) SSL certificate problem: unable to get local issuer certificate
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.
HTTPS-proxy has similar options --proxy-cacert and --proxy-insecure.

调查

先用 openssl 验证 ca.crt 和 server.crt,自签署的 ca.crt 和被签署的 server.crt 都没有问题。

$ openssl verify -CAfile ca.crt ca.crt
ca.crt: OK

$ openssl verify -CAfile ca.crt server.crt
server.crt: OK

用 Google 搜索,有好多人说这是因为 macOS 上的 curl 会使用 keychain(钥匙串) 中的证书,建议安装 gnu 版本的 curl 等等。 被这些回答带到沟里了,安装 gnu curl 后还是不行,把自签署的 ca.crt 加入 keychain 后,还是不行。最后干脆在 centos 系统上试了一下,同样的问题!

后来用 chrome 打开网址,查看证书详情,发现服务端证书不是指定域名的证书,而是 ingress-nginx 的一个 fake 证书(Kubernetes Ingress Controller Fake Certificate):

Kubernetes Ingress Controller Fake Certificate

回去查看创建的 ingress,指定的证书是 tls-secret:

tls:
- hosts:
  - auth-cert.echo.example
  secretName: tls-secret

当前 namespace 中不存在这个 secret,在创建 tls-secret 时没有指定 namespace,错误的把 tls-secret 存放到 default 中。ingress 指向了一个不存在的证书,所以出现了上述问题。

参考

  1. 李佶澳的博客
  2. ingress-nginx 的认证功能使用示例

kubernetes_problem

  1. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  2. kubernetes ingress-nginx 的 canary 影响指向同一个 service 的所有 ingress
  3. ingress-nginx 启用 tls 加密,配置了不存在的证书,导致 unable to get local issuer certificate
  4. https 协议访问,误用 http 端口,CONNECT_CR_SRVR_HELLO: wrong version number
  5. Kubernetes ingress-nginx 4 层 tcp 代理,无限重试不存在的地址,高达百万次
  6. Kubernetes 集群中个别 Pod 的 CPU 使用率异常高的问题调查
  7. Kubernetes 集群 Node 间歇性变为 NotReady 状态: IO 负载高,延迟严重
  8. Kubernetes的nginx-ingress-controller刷新nginx的配置滞后十分钟导致504
  9. Kubernetes的Nginx Ingress 0.20之前的版本,upstream的keep-alive不生效
  10. Kubernetes node 的 xfs文件系统损坏,kubelet主动退出且重启失败,恢复后无法创建pod
  11. Kubernetes的Pod无法删除,glusterfs导致docker无响应,集群雪崩
  12. Kubernetes集群node无法访问service: kube-proxy没有正确设置cluster-cidr
  13. Kubernetes集群node上的容器无法ping通外网: iptables snat规则缺失导致
  14. Kubernetes问题调查: failed to get cgroup stats for /systemd/system.slice
  15. Kubelet1.7.16使用kubeconfig时,没有设置--require-kubeconfig,导致node不能注册
  16. Kubelet从1.7.16升级到1.9.11,Sandbox以外的容器都被重建的问题调查
  17. Kubernetes: 内核参数rp_filter设置为Strict RPF,导致Service不通
  18. Kubernetes使用过程中遇到的一些问题与解决方法
  19. Kubernetes集群节点被入侵挖矿,CPU被占满
  20. kubernetes的node上的重启linux网络服务后,pod无法联通
  21. kubernetes的pod因为同名Sandbox的存在,一直无法删除
  22. kubelet升级,导致calico中存在多余的workloadendpoint,node上存在多余的veth设备
  23. 使用petset创建的etcd集群在kubernetes中运行失败
  24. Kubernetes 容器启动失败: unable to create nf_conn slab cache
  25. 未在calico中创建hostendpoint,导致开启隔离后,在kubernetes的node上无法访问pod
  26. calico分配的ip冲突,pod内部arp记录丢失,pod无法访问外部服务
  27. kubernetes的dnsmasq缓存查询结果,导致pod偶尔无法访问域名
  28. k8s: rbd image is locked by other nodes
  29. kuberntes的node无法通过物理机网卡访问Service

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球