Kubernetes Istio:如何重定向到HTTPS,除了/.well-known/acme挑战

Kubernetes 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

我希望以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,但我不知道如何获取$HOST
如何使用istio实现这一点?

查看文档:

  • HTTP-01质询只能在端口80上执行。允许客户端指定任意端口会降低质询的安全性,因此ACME标准不允许这样做
作为解决办法:

  • 请考虑使用DNS01挑战:
  • 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
    
    此外,您还必须更改虚拟服务,以将除
    前缀:/.众所周知的/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挑战。。。有没有办法只重定向网关中的某些路由?