我有一个AWS API Gateway和一个Ingress Nginx。
我希望我的入口只接受来自 API 网关的 trafic :所以我使用了 AWS API 网关客户端证书。
我已经创建了客户端证书的密钥:
kubectl create secret generic api --from-file=api-gateway-client-certificate.crt
我的入口服务具有以下配置(它是TCP AWS经典ELB(:
kind: Service
apiVersion: v1
metadata:
name: ingress-nginx
namespace: ingress
labels:
app: ingress-nginx
annotations:
ingress.kubernetes.io/server-alias: 'dev.ingress.website.com'
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600'
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
spec:
type: LoadBalancer
selector:
app: ingress-nginx
ports:
- name: https
port: 443
targetPort: http
我的入口规则看起来像这样:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/api"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
name: items
spec:
tls:
- hosts:
- dev.ingress.website.com
secretName: ingress-website-com-tls
rules:
- host: dev.ingress.website.com
http:
paths:
- backend:
serviceName: items
servicePort: 80
path: "/items"
但它不起作用。 我可以通过浏览器访问 dev.ingress.website.com/items:只有API网关才能访问。
这是nginx.conf的输出:
location /items {
if ($scheme = https) {
more_set_headers "Strict-Transport-Security: max-age=15724800; includeSubDomains;";
}
port_in_redirect off;
set $proxy_upstream_name "default-items-80";
set $namespace "default";
set $ingress_name "items";
set $service_name "items";
# enforce ssl on server side
if ($redirect_to_https) {
return 308 https://$best_http_host$request_uri;
}
proxy_set_header Host $best_http_host;
# Pass the extracted client certificate to the backend
proxy_set_header ssl-client-cert "";
proxy_set_header ssl-client-verify "";
proxy_set_header ssl-client-dn "";
似乎ssl-client-cert
和ssl-client-verify
是空的。所以我想是因为那个?
但我不知道为什么。有没有人对如何解决它有见解?
提前感谢!J.
我在 Azure 中遇到了相同的情况,所以我最终使用内部 LB 运行入口......将 API GW 放在同一个 VNET 中,以便我可以访问。我认为无论如何这是一个开销。