本主题介绍了如何启用非 SNI 客户端,以用于 Apigee Hybrid。
如何配置非 SNI 客户端
本部分介绍如何在 Apigee Hybrid 中支持非 SNI(服务器名称指示)客户端。
SNI 定义了 TLS 对等方(客户端)如何在初始 TLS 握手期间指定其打算连接的主机名。自 2003 年以来,SNI 一直是 TLS 的一部分。在 SNI 出现之前,当 TLS 对等方发送 HELLO 来开始握手时,接收对等方始终会使用相同的凭据进行响应。引入 SNI 是为了让单个负载平衡器能够支持多个不同的主机名和凭据集,以进行 TLS 连接管理。现在,绝大多数 TLS 客户端都使用 SNI。
不过,也有例外情况。举例来说,Google Cloud 负载平衡器将使用非 SNI 握手来连接到后端。
如果您希望配置 Apigee Hybrid,使其能够处理不使用 SNI 的 TLS 握手,无论是由于 Apigee Hybrid 是 Google Cloud Load Balancer 的后端,还是由于 Apigee Hybrid 必须支持某些其他非 SNI 客户端,您都应按照下述步骤操作。 非 SNI 协商将作为后备方案;对于不使用 SNI 的任何客户端,Apigee Hybrid 都会使用它。
- 创建
ApigeeRoute
资源。 确保将enableNonSniClient
设置为true
:apiVersion: apigee.cloud.google.com/v1alpha1 kind: ApigeeRoute metadata: name: ROUTE_NAME namespace: APIGEE_NAMESPACE spec: hostnames: - "*" ports: - number: 443 protocol: HTTPS tls: credentialName: CREDENTIAL_NAME mode: SIMPLE #optional minProtocolVersion: TLS_AUTO selector: app: apigee-ingressgateway enableNonSniClient: true
其中:
- ROUTE_NAME 是您为自定义资源 (CR) 指定的名称。
- CREDENTIAL_NAME 是 Kubernetes Secret 的名称,它部署到包含您的虚拟主机的 TLS 凭据的集群。您可以使用以下
kubectl
命令查找凭据名称:kubectl -n APIGEE_NAMESPACE get ApigeeRoutes -o=yaml | grep credentialName
hostnames
必须设置为通配符“*”。
- 打开替换文件,然后执行下一步中所述的更改。
- 对于每个环境组,将 ApigeeRoute 名称添加到
additionalGateways
属性。例如:virtualhosts: - name: default sslCertPath: ./certs/fullchain.pem sslKeyPath: ./certs/privkey.pem additionalGateways: ["ROUTE_NAME"]
- 保存 CRD 文件。例如:
ApigeeRoute.yaml
- 将 CRD 应用到集群:
kubectl apply -f ApigeeRoute.yaml -n APIGEE_NAMESPACE
- 将更改应用于
virtualhosts
。如果您已在 shell 中设置 $ENV_GROUP 环境变量,则可以在以下命令中使用该变量:helm upgrade $ENV_GROUP apigee-virtualhost/ \ --namespace APIGEE_NAMESPACE \ --atomic \ --set envgroup=$ENV_GROUP \ -f OVERRIDES_FILE.yaml
使用说明
- 如果集群有多个组织,会发生什么情况?
对于给定端口 (443),Ingress 位于集群级层,并且 ApigeeRoute CRD 只能有一个密钥/证书对,因此所有组织必须共用相同的密钥/证书对。
- 如果集群有多个环境组,会发生什么情况?虚拟主机共用同一个密钥/证书对是否可行?
所有环境组中的所有主机名都必须使用相同的密钥/证书对。
- 我们为何要创建 ApigeeRoute 而不是网关?
ApigeeRoutes 可以由 Apigee 验证;但网关 (Istio CRD) 不能。从技术上讲,即使可以使用网关,但我们可以(通过验证网络钩子)避免潜在的配置错误。
- 如何为 Apigee 配置非 SNI 客户端?
如果 Apigee 实例是通过 Google 负载均衡器公开的,则该负载均衡器支持非 SNI 客户端,如负载均衡文档中所述。 否则,如果您已通过内部 PSC 端点或 VPC 公开 Apigee 实例,则默认情况下,该 Apigee 实例支持非 SNI 客户端。