将 SNI 与 Edge 搭配使用

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

服务器名称指示 (SNI) 允许通过同一 IP 地址和端口提供多个 HTTPS 目标,而无需这些目标使用同一 TLS 证书。在客户端上启用 SNI 后,客户端会在初始 TLS 握手期间传递目标端点的主机名。这样一来,TLS 服务器就可以确定应使用哪个 TLS 证书来验证请求。

例如,如果请求目标是 https://example.com/request/path,则 TLS 客户端会将 server_name 扩展添加到 TLS 握手请求,如下所示:

Edge 支持以下方面的 SNI:

  • 从客户端应用发往 API 代理的请求。在此场景中,Edge 充当 TLS 服务器
  • 从 Edge 到后端的请求。在这种情况下,Edge 充当 TLS 客户端。

如需详细了解 SNI,请参阅:

支持在 Edge 上向 API 代理发送请求时使用 SNI

对 API 代理的请求的 SNI 支持由主机别名和虚拟主机控制。

虚拟主机和主机别名的简介

在 Edge 中,虚拟主机定义了公开 API 代理的 IP 地址和端口或 DNS 名称和端口,以及按扩展名,应用用于访问 API 代理的网址。 IP 地址/DNS 名称对应于边缘路由器,端口号是路由器上的开放端口。

创建虚拟主机时,您还需要指定虚拟主机的主机别名。 通常,这是虚拟主机的 DNS 名称。在确定处理请求的 API 代理时,路由器会将传入请求的 Host 标头与所有虚拟主机定义的可用的主机别名列表进行比较。

虚拟主机的主机别名和端口号的组合对于 Edge 安装中的所有虚拟主机必须是唯一的。这意味着,如果多个虚拟主机具有不同的主机别名,则可以使用相同的端口号

虚拟主机还定义了是使用 HTTP 协议还是使用加密 HTTPS 协议(使用 TLS)访问 API 代理。配置虚拟主机以使用 HTTPS 时,请将虚拟主机与包含证书和私钥的密钥库相关联,虚拟主机在 TLS 握手期间会使用这些证书和私钥。

如需详细了解虚拟主机,请参阅:

SNI 如何与主机别名搭配使用

借助 SNI,您可以在同一端口上定义多个虚拟主机,每个虚拟主机都具有不同的 TLS 证书和密钥。然后,Edge 会根据 TLS 握手请求中的 server_name 扩展程序确定虚拟主机以及 TLS 使用的证书/密钥对。

Edge 路由器会读取 TLS 握手请求中的 server_name 扩展程序,然后使用该扩展程序搜索所有虚拟主机中的主机别名。如果路由器检测到与主机别名匹配,则会使用与该主机别名关联的虚拟主机中的 TLS 证书和密钥。如果未找到匹配项,TLS 握手会失败。

您可以定义默认证书/密钥对,而不是让 TLS 握手失败,如下一部分中所述。

在 Edge for the Cloud 中定义默认证书/密钥对

Apigee 提供 TLS 证书和私钥来支持 HTTPS。虽然许多客户倾向于在部署时使用自己的证书和私钥,但您也可以使用 Apigee 证书和密钥来部署 API。

在 Edge for Cloud 中,如果路由器无法将 SNI 标头与主机别名匹配,或者客户端不支持 SNI,则路由器会使用 Apigee 提供的默认证书 (*.apigee.net)。

在 Edge Private Cloud 中定义默认证书/密钥对

在 Edge for Private Cloud 中,如果 server_name 扩展名与所有虚拟主机中的主机别名之间未找到匹配项,或者请求客户端不支持 SNI,您可以配置路由器以使用端口上默认虚拟主机中的证书/密钥。默认虚拟主机由组织名称、环境名称和虚拟主机名称组合而成,格式如下:

orgName_envName_vhName

路由器使用按字母顺序排在最前面的 orgName_envName_vhName 组合中的证书/密钥。例如,请求通过端口 443 进入,并且在环境 prod 中为组织 example 定义了两个虚拟主机:

  • 虚拟主机名 = default
  • 虚拟主机名 = test

在此示例中,路由器使用名为 default 的虚拟主机中的证书/密钥,因为 example_prod_default 在字母顺序上位于 example_prod_test 之前。

如需启用默认虚拟主机,请执行以下操作:

  1. 在第一个路由器节点上,修改 /opt/apigee/customer/application/router.properties。 如果该文件不存在,请创建它。
  2. 向该文件添加以下属性,以便您定义默认虚拟主机:
    conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
  3. 重启路由器:
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  4. 在所有剩余的路由器上重复执行这些步骤。

您可以在路由器上明确定义默认证书/密钥,而不是使用默认虚拟主机的证书/密钥。使用以下过程来定义显式默认证书/密钥对:

  1. 在第一个路由器节点上,将证书和私钥复制到路由器节点上可供 apigee 用户访问的位置。例如 /opt/apigee/customer/application
  2. 将文件的所有权更改为“apigee. user:
    chown apigee:apigee /opt/apigee/customer/application/myCert.pem
    chown apigee:apigee /opt/apigee/customer/application/myKey.pem
  3. 修改“/opt/apigee/customer/application/router.properties”。 如果该文件不存在,请创建它。
  4. 向文件添加以下属性,以便您指定默认证书/密钥:
    conf_load_balancing_load.balancing.driver.nginx.fallback.server.default.ssl.template.enabled=true
    conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
  5. router.properties 中设置以下属性,以指定证书和密钥的位置:
    conf_load_balancing_load.balancing.driver.nginx.ssl.cert=/opt/apigee/customer/application/myCert.pem
    conf_load_balancing_load.balancing.driver.nginx.ssl.key=/opt/apigee/customer/application/myKey.pem
  6. 重启路由器:
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  7. 在所有剩余的路由器上重复执行这些步骤。

支持从 Edge 到后端的请求的 SNI

在 Apigee Edge for Cloud 和 Private Cloud 部署中,Edge 支持从消息处理器使用 SNI 来定位目标端点。默认情况下,Edge 消息处理器在云中启用 SNI,在私有云中停用 SNI。

在 Edge Private Cloud 中使用 SNI 将流量路由到后端

对于 Edge for Private Cloud,为了向后兼容现有目标后端,Apigee 默认停用了 SNI。如果您的目标后端配置为支持 SNI,您可以按照下文所述为您的 Edge 版本启用此功能。

无需进行其他 Edge 专用配置。如果目标环境配置为 SNI,Edge 会支持该配置。Edge 会自动从请求网址中提取主机名,并将其添加到 TLS 握手请求中。

为 Edge 版本 4.15.07.0x 启用 Edge 与后端之间的 SNI

使用以下步骤启用 SNI:

  1. 在第一个消息处理器节点上,通过编辑器打开文件 /opt/apigee4/conf/apigee/message-processor/system.properties
  2. system.properties 中将以下属性设置为 true:
    jsse.enableSNIExtension=true
  3. 重启消息处理器:
    /opt/apigee4/bin/apigee-service message-processor restart
  4. 在所有剩余的消息处理器上重复这些步骤。

在 Edge 和后端之间启用 SNI(适用于 Edge 4.16.01 及更高版本)

使用以下步骤启用 SNI:

  1. 在第一个消息处理器节点上,修改 /opt/apigee/customer/application/message-processor.properties。 如果该文件不存在,请创建它。
  2. 将以下属性添加到文件中:
    conf_system_jsse.enableSNIExtension=true
  3. 重启消息处理器:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  4. 在所有剩余的消息处理器上重复这些步骤。