将 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 的其他信息,请参阅:

支持使用 SNI 向 Edge 上的 API 代理发出请求

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

关于虚拟主机和主机别名

使用 Edge 时,虚拟主机会定义公开 API 代理的 IP 地址和端口(或 DNS 名称和端口),进而定义应用用于访问 API 代理的网址。IP 地址/DNS 名称对应于边缘路由器,并且端口号是路由器上的开放端口。

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

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

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

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

SNI 如何与主机别名协同工作

通过 SNI,您可以在同一端口上定义多个虚拟主机,每个主机具有不同的 TLS 证书和密钥。然后,边缘根据 TLS 握手请求中的 server_name 扩展来确定虚拟主机和 TLS 使用的证书/密钥对。

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

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

在 Edge 中为云端定义默认证书/密钥对

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

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

在 Edge 中为私有云定义默认证书/密钥对

在 Private Cloud 的 Edge 中,如果 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.”用户:
    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. 在其余的所有路由器上重复这些步骤。

支持使用 SNI 处理从边缘到后端的请求

Edge 支持使用来自消息处理器的 SNI 定位用于云端和私有云部署的 Apigee Edge 中的端点。默认情况下,系统会在边缘消息处理器上为云端启用 SNI,并在私有云中停用 SNI。

在适用于私有云的 Edge 中使用 SNI 连接到后端

对于适用于私有云的 Edge,为了向后兼容现有的目标后端,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 4.16.01 及更高版本启用 Edge 和后端之间的 SNI

使用以下步骤启用 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. 对其余所有消息处理器重复上述步骤。