我希望以HTTP形式进入集群的流量重定向到HTTPS。然而,集群接收来自数百个域的请求,这些域通常会发生变化(使用证书管理器创建新的证书(。因此,我希望只有当URI没有前缀/.well-known/acme-challenge
时才进行重定向
我使用的是一个监听443的网关和另一个监听80并将HTTP发送到acme solver虚拟服务的网关。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: default-gateway
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- site1.com
port:
name: https-site1.com
number: 443
protocol: HTTPS
tls:
credentialName: cert-site1.com
mode: SIMPLE
- hosts:
- site2.com
port:
name: https-site2.com
number: 443
protocol: HTTPS
tls:
credentialName: cert-site2.com
mode: SIMPLE
...
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: acme-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: acme-solver
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- acme-gateway
http:
- match:
- uri:
prefix: /.well-known/acme-challenge
route:
- destination:
host: acme-solver.istio-system.svc.cluster.local
port:
number: 8089
- redirect:
authority: # Should redirect to https://$HOST, but I don't know how to get the $HOST
如何使用istio做到这一点?
查看文档:
- HTTP-01挑战只能在端口80上完成。允许客户端指定任意端口会降低挑战的安全性,因此ACME标准不允许这样做
作为一种变通方法:
- 请考虑使用DNS-01挑战:
a(只有当您的DNS提供商具有可用于自动更新的API时,才有意义使用DNS-01挑战。
b( 使用这种方法,您应该考虑文档中所述的额外安全风险:
优点:您可以使用此挑战颁发包含通配符域名的证书。即使您有多个web服务器,它也能很好地工作。
缺点:*在web服务器上保留API凭据是有风险的您的DNS提供商可能不提供API。您的DNS API可能无法提供有关传播时间的信息。
如前所述:
不过,为了实现自动化,请求证书的软件还需要能够修改该域的DNS记录。为了修改DNS记录,该软件还需要访问DNS服务的凭据(例如登录名和密码或加密令牌(,并且这些凭据必须存储在自动化发生的任何地方。在许多情况下,这意味着如果处理进程的机器受到威胁,DNS凭据也会受到威胁,而这才是真正的危险所在。
- 我还建议使用另一种方法,使用一些简单的nginx pod,将所有http流量重定向到https
有一个关于nginx配置介质的教程,你可以尝试使用。
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
---
apiVersion: v1
kind: Service
metadata:
name: redirect
labels:
app: redirect
spec:
ports:
- port: 80
name: http
selector:
app: redirect
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redirect
spec:
replicas: 1
selector:
matchLabels:
app: redirect
template:
metadata:
labels:
app: redirect
spec:
containers:
- name: redirect
image: nginx:stable
resources:
requests:
cpu: "100m"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: /etc/nginx/conf.d
name: config
volumes:
- name: config
configMap:
name: nginx-config
此外,您必须更改虚拟服务,才能将除prefix: /.well-known/acme-challenge
之外的所有流量发送到nginx。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: acme-solver
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- acme-gateway
http:
- name: "acmesolver"
match:
- uri:
prefix: /.well-known/acme-challenge
route:
- destination:
host: reviews.prod.svc.cluster.local
port:
number: 8089
- name: "nginx"
route:
- destination:
host: nginx