将 nginx 代理到 ingress-nginx 以进行迁移

Proxy nginx to ingress-nginx for migration purpose

上下文

我正在从传统的 docker 主机迁移到 kubernetes 集群。

我想在迁移期间保持服务的连续性。

为此,我将本地 nginx 代理到远程 ingress-nginx。然后,我更新 DNS 记录。这是一个很好的设置,原因有两个:

同时未生成证书,nginx 将获得默认的自签名证书。我知道,所以我想验证一下,但我做不到。

最小问题

无需过多讨论 nginx 配置,我们可以仅使用 curl 重现该问题。

这是我获得远程自签名证书的方式:

openssl s_client -showcerts -servername standard.ingress.indie.host -connect standard.ingress.indie.host:443 < /dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' > server.pem

而且我希望以下命令能够工作:

curl --cacert ./server.pem https://standard.ingress.indie.host

但事实并非如此..我想知道我做错了什么,如果你能帮忙,那就太棒了!谢谢!

PS: 这才是真正的主人,所以你可以测试,问题是生活。

我认为有两件事阻止了 curl 命令的工作,顺序如下:

  1. X509v3 Basic Constraints: critical CA:FALSE
  2. X509v3 Subject Alternative Name: DNS:ingress.local

O=Acme Co, CN=Kubernetes Ingress Controller Fake Certificate 证书不是 CA,它只是自签名的。因此,(据我所知)no --cacert 的值将代表 X509 层次结构中的 "parent" 并使 curl 能够信任 CA 证书的子证书。

但是,即使该证书有一个假设的颁发 CA,它也只是为 ingress.local 的 SAN 颁发的,standard.ingress.indie.host 绝对不匹配。

我无法从你的问题中判断 curl --insecure 是否适合你,或者你只是使用 curl 来指示浏览器发生的不良 SSL 结果(他们不容易--insecure).


话虽如此,我相信可以实际生成一个伪造的 CA,然后针对它颁发证书,将其安装在 nginx 中,然后将伪造的 CA 提供给 curl --cafile(或者,如果需要,将 CA 安装到 OS) 的受信任证书存储中。

如果有更多细节对您有帮助,请继续跟进。