不同的主机(Kubernetes 中的 Pods)对同一主机名使用不同的证书进行响应
Different hosts (Pods in Kubernetes) responds with different certificate for the same hostname
我有一个奇怪的问题 - 当询问我的内部主机名时,xxx.home.arpa
通过例如 openssl s_client -connect xxx.home.arpa:443
一个(示例)pod
- image: docker.io/library/node:8.17.0-slim
name: node
args:
- "86400"
command:
- sleep
正在收到 DEFAULT NGINX INGRESS CERTIFICATE 的响应。
同一命名空间中的其他 pod 对于同一命令 正在使用我的 自定义证书 获得响应。
问题:
为什么同一个 pod 收到不同的证书?
为了这个问题的目的,请假设 cert-manager 和 certs 应该正确配置 - 它们在系统的大部分工作,只有少数 pods 行为不当
配置: k8s nginx ingress, calico CNI, custom coredns svc which manages DNS responses (might be important?), my own CA authority.
e:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: ca-issuer
kubernetes.io/ingress.class: nginx
creationTimestamp: "2022-03-13T06:54:17Z"
generation: 1
name: gerrit-ingress
namespace: gerrit
resourceVersion: "739842"
uid: f22034ab-0ed8-4779-b01e-2738e6f63eb7
spec:
rules:
- host: gerrit.home.arpa
http:
paths:
- backend:
service:
name: gerrit-gerrit-service
port:
number: 80
pathType: ImplementationSpecific
tls:
- hosts:
- gerrit.home.arpa
secretName: gerrit-tls
status:
loadBalancer:
ingress:
- ip: 192.168.10.2
大部分配置(DNS 除外)is up here。
事实证明,我最初的猜测大相径庭——特定容器有一组工具,它们都配置为不发送服务器名(或者根本不支持 SNI,这是问题所在),具体来说 yarn:1.x
和 openssl:1.0.x
.
问题当然出在 SNI 上,较新的 openssl 或 curl 默认使用 -servername 来满足 SNI 要求。
为此我考虑了两种解决方案:
- 不支持SNI的客户端使用通配符DNS,更简单但感觉不安全
- 带反向代理的 TLS 终止允许我透明地使用支持 SNI 的客户端,我还没有尝试过。
我使用了通配符 DNS,但我认为这不应该在产品中完成。 :)
我有一个奇怪的问题 - 当询问我的内部主机名时,xxx.home.arpa
通过例如 openssl s_client -connect xxx.home.arpa:443
一个(示例)pod
- image: docker.io/library/node:8.17.0-slim
name: node
args:
- "86400"
command:
- sleep
正在收到 DEFAULT NGINX INGRESS CERTIFICATE 的响应。
同一命名空间中的其他 pod 对于同一命令 正在使用我的 自定义证书 获得响应。
问题: 为什么同一个 pod 收到不同的证书?
为了这个问题的目的,请假设 cert-manager 和 certs 应该正确配置 - 它们在系统的大部分工作,只有少数 pods 行为不当
配置: k8s nginx ingress, calico CNI, custom coredns svc which manages DNS responses (might be important?), my own CA authority.
e:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: ca-issuer
kubernetes.io/ingress.class: nginx
creationTimestamp: "2022-03-13T06:54:17Z"
generation: 1
name: gerrit-ingress
namespace: gerrit
resourceVersion: "739842"
uid: f22034ab-0ed8-4779-b01e-2738e6f63eb7
spec:
rules:
- host: gerrit.home.arpa
http:
paths:
- backend:
service:
name: gerrit-gerrit-service
port:
number: 80
pathType: ImplementationSpecific
tls:
- hosts:
- gerrit.home.arpa
secretName: gerrit-tls
status:
loadBalancer:
ingress:
- ip: 192.168.10.2
大部分配置(DNS 除外)is up here。
事实证明,我最初的猜测大相径庭——特定容器有一组工具,它们都配置为不发送服务器名(或者根本不支持 SNI,这是问题所在),具体来说 yarn:1.x
和 openssl:1.0.x
.
问题当然出在 SNI 上,较新的 openssl 或 curl 默认使用 -servername 来满足 SNI 要求。
为此我考虑了两种解决方案:
- 不支持SNI的客户端使用通配符DNS,更简单但感觉不安全
- 带反向代理的 TLS 终止允许我透明地使用支持 SNI 的客户端,我还没有尝试过。
我使用了通配符 DNS,但我认为这不应该在产品中完成。 :)