您正在对 Kubernetes 中启用 SSL 的服务器端口使用纯 HTTP

Posted

技术标签:

【中文标题】您正在对 Kubernetes 中启用 SSL 的服务器端口使用纯 HTTP【英文标题】:You're speaking plain HTTP to an SSL-enabled server port in Kubernetes 【发布时间】:2020-06-24 14:33:02 【问题描述】:

我的网关文件是

api版本:networking.istio.io/v1alpha3 种类:网关 元数据: 名称:我的网关安全 命名空间:myapp 规格: 选择器: istio: ingressgateway # 使用 istio 默认控制器 服务器: - 港口: 数量:443 名称:https 协议:HTTPS tls: 模式:简单 服务器证书:/etc/istio/ingressgateway-certs/tls.crt 私钥:/etc/istio/ingressgateway-certs/tls.key #caCertificates: /etc/istio/ingressgateway-ca-certs/kbundle.crt 主持人: - “*” api版本:networking.istio.io/v1alpha3 种类:虚拟服务 元数据: 名称:我的网关服务安全 命名空间:myapp 规格: 主持人: - “sub.domaincom” 网关: - 我的网关安全 网址: - 路线: - 目的地: 主持人:我的单声道 港口: 数量:443 协议:TCP

我的服务文件是

api版本:v1 种类:服务 元数据: 名称:我的单声道 命名空间:myapp 标签: 层:后端 规格: 选择器: 应用程序:我的单声道 层:后端 端口: - 端口:443 名称:https 协议:TCP

部署文件如下

api版本:应用程序/v1 种类:部署 元数据: 名称:我的单声道 命名空间:myapp 规格: 复制品:1 选择器: 匹配标签: 应用程序:我的单声道 模板: 元数据: 标签: 应用程序:我的单声道 规格: 容器: - 名称:我的单声道 图片:myapacheimage imagePullPolicy:从不 端口: - 容器端口:443

当我使用网关访问我的服务时,它说

错误的请求 您的浏览器发送了此服务器无法理解的请求。 原因:您对启用 SSL 的服务器端口使用纯 HTTP。 请改用 HTTPS 方案访问此 URL。 Apache/2.4.38 (Debian) 服务器位于 10.0.159.77 端口 443

我可以确认 apache 只监听 443 并且配置正确

【问题讨论】:

在网址中使用https? 是的,我正在使用 https 访问 协议:TCP应该是HTTPS吗? 10.0.159.77 是什么IP? 在服务声明中是不允许的,在网关的服务声明中它不会显示任何不同的结果。 【参考方案1】:

您的配置在 istio 网关上使用 TLS 终结点。因此,进入 istio 入口的 HTTPS 流量在到达您的服务端点之前会被解密为纯 HTTP 流量。


要解决此问题,您需要配置 HTTPSHTTPS 服务的入口访问,即配置入口网关以执行 SNI 直通,而不是 TLS 终止传入请求。

您可以在 istio 文档指南 here 中找到没有 TLS 终止的 Ingress Gateway 示例。


您的GatewayVirtualService 应该如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway-secure
  namespace: myapp
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: PASSTHROUGH
    hosts:
    - "*"

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-gateway-service-secure
  namespace:myapp
spec:
  hosts:
  - "sub.domaincom"
  gateways:
  - my-gateway-secure
  tls:
  - match:
    - port: 443
      sni_hosts:
      - "sub.domaincom"
    route:
    - destination:
        host: my-mono
        port:
          number: 443

希望对你有帮助。

【讨论】:

最佳答案。非常感谢我想通了。但我对主机值和 sni_hosts 有一些困惑。您的回答帮助我彻底解决了这个问题。非常感谢。

以上是关于您正在对 Kubernetes 中启用 SSL 的服务器端口使用纯 HTTP的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GKE 上为 Kubernetes Ingress 强制 SSL

怎么开启ssl协议

在 XAMPP 中为 CURL 启用 SSL 支持

Mysql Workbench 连接 ssl 未启用

为啥启用 SSL 时 Charles Proxy 不起作用?

为 SSL 套接字启用哪些密码套件?