将 nginx 代理到 ingress-nginx 以进行迁移
Proxy nginx to ingress-nginx for migration purpose
上下文
我正在从传统的 docker 主机迁移到 kubernetes 集群。
我想在迁移期间保持服务的连续性。
为此,我将本地 nginx 代理到远程 ingress-nginx。然后,我更新 DNS 记录。这是一个很好的设置,原因有两个:
- dns 传播时流量继续流动
- 我可以在 ingress-nginx 中生成一个 let's encrypt 证书,所以一旦 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
命令的工作,顺序如下:
X509v3 Basic Constraints: critical CA:FALSE
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) 的受信任证书存储中。
如果有更多细节对您有帮助,请继续跟进。
上下文
我正在从传统的 docker 主机迁移到 kubernetes 集群。
我想在迁移期间保持服务的连续性。
为此,我将本地 nginx 代理到远程 ingress-nginx。然后,我更新 DNS 记录。这是一个很好的设置,原因有两个:
- dns 传播时流量继续流动
- 我可以在 ingress-nginx 中生成一个 let's encrypt 证书,所以一旦 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
命令的工作,顺序如下:
X509v3 Basic Constraints: critical CA:FALSE
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) 的受信任证书存储中。
如果有更多细节对您有帮助,请继续跟进。