Kubernetes Istio:如何重定向到HTTPS,除了/.well-known/acme挑战
我希望以HTTP的形式进入集群的流量被重定向到HTTPS。但是,集群接收来自数百个域的请求,这些域会进行动态更改(使用cert manager创建新的证书)。因此,我希望重定向只在URI没有前缀时发生 我正在使用一个侦听443的网关和另一个侦听80并将HTTP发送到acme solver虚拟服务的网关 apiVersion:networking.istio.io/v1alpha3 种类:网关 元数据: 名称:默认网关 规格: 选择器: 伊斯蒂奥:入口大道 服务器: -主持人: -site1.com 端口: 名称:https-site1.com 电话:443 协议:HTTPS tls: 证书名称:cert-site1.com 模式:简单 -主持人: -网站2.com 端口: 名称:https-site2.com 电话:443 协议:HTTPS tls: 证书名称:cert-site2.com 模式:简单 ... --- apiVersion:networking.istio.io/v13 种类:网关 元数据: 名称:acme网关 名称空间:istio系统 规格: 选择器: 伊斯蒂奥:入口大道 服务器: -主持人: - '*' 端口: 名称:http 电话:80 协议:HTTP --- apiVersion:networking.istio.io/v13 种类:虚拟服务 元数据: 名称:顶点解算器 名称空间:istio系统 规格: 主持人: - "*" 网关: -acme网关 http: -匹配: -uri: 前缀:/。著名的/acme挑战 路线: -目的地: 主机:acme-solver.istio-system.svc.cluster.local 端口: 电话:8089 -重定向: 权限:#应该重定向到https://$HOST,但我不知道如何获取$HOSTKubernetes Istio:如何重定向到HTTPS,除了/.well-known/acme挑战,kubernetes,https,istio,cert-manager,acme,Kubernetes,Https,Istio,Cert Manager,Acme,我希望以HTTP的形式进入集群的流量被重定向到HTTPS。但是,集群接收来自数百个域的请求,这些域会进行动态更改(使用cert manager创建新的证书)。因此,我希望重定向只在URI没有前缀时发生 我正在使用一个侦听443的网关和另一个侦听80并将HTTP发送到acme solver虚拟服务的网关 apiVersion:networking.istio.io/v1alpha3 种类:网关 元数据: 名称:默认网关 规格: 选择器: 伊斯蒂奥:入口大道 服务器: -主持人: -site1.co
如何使用istio实现这一点?查看文档:
- HTTP-01质询只能在端口80上执行。允许客户端指定任意端口会降低质询的安全性,因此ACME标准不允许这样做
b)使用这种方法,你应该考虑额外的安全风险,如:
优点: 您可以使用此挑战来颁发包含通配符域名的证书。 即使您有多个web服务器,它也可以正常工作 缺点: *在web服务器上保留API凭据是有风险的。 您的DNS提供商可能不提供API。 您的DNS API可能不提供有关传播时间的信息 如上所述: 但是,为了实现自动化,请求证书的软件还需要能够修改该域的DNS记录。为了修改DNS记录,该软件还需要访问DNS服务的凭据(例如登录名和密码或加密令牌),并且这些凭据必须存储在自动化发生的任何位置。在许多情况下,这意味着如果处理进程的机器受到破坏,DNS凭据也会受到破坏,这才是真正的危险所在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
此外,您还必须更改虚拟服务,以将除前缀:/.众所周知的/acme挑战
之外的所有流量发送到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
好吧,这是不可能的,除非您在-redirect:authority:中指定了确切的主机名,例如like。您是否已尝试在网关中配置httpsRedirect,如中所述?还有一个问题。@Jakub谢谢你的回答。我试图在网关中进行配置,但随后所有流量都被重定向到HTTPS,因此Let's Encrypt无法完成acme挑战。。。有没有办法只重定向网关中的某些路由?