将 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 Router 会读取 TLS 握手请求中的 server_name 扩展,然后使用该扩展对所有虚拟主机中的主机别名进行搜索。如果路由器检测到与主机别名匹配的请求,则会使用与主机别名关联的虚拟主机中的 TLS 证书和密钥。如果未找到匹配项,TLS 握手会失败。

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

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

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

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

在 Edge for 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

Edge 支持使用消息处理器中的 SNI 将请求发送到 Apigee Edge for Cloud 和私有云部署中的目标端点。默认情况下,Cloud 的 Edge 消息处理器上启用了 SNI,而 Private Cloud 中停用了 SNI。

在 Edge for Private Cloud 中使用 SNI 连接到后端

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

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

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

请按以下步骤启用 SNI:

  1. 在第一个 Message Processor 节点上,在编辑器中打开 /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. 对所有其余的消息处理程序重复上述步骤。