您正在查看 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,请参阅:
- https://en.wikipedia.org/wiki/Server_Name_Indication
- http://blog.layershift.com/sni-ssl-production-ready/
支持对 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
之前。
如需启用默认虚拟主机,请执行以下操作:
- 在第一个路由器节点上,修改
/opt/apigee/customer/application/router.properties
。 如果该文件不存在,请创建一个。 - 将以下属性添加到该文件,以便您定义默认虚拟主机:
conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
- 重启路由器:
/opt/apigee/apigee-service/bin/apigee-service edge-router restart
- 对所有其余路由器重复上述步骤。
您可以直接在路由器上明确定义默认证书/密钥,而不是使用默认虚拟主机中的证书/密钥。请按照以下步骤定义显式默认证书/密钥对:
- 在第一个路由器节点上,将证书和私钥复制到路由器节点上可供 apigee 用户访问的位置。例如
/opt/apigee/customer/application
。 - 将文件的所有权更改为“apigee. user”:
chown apigee:apigee /opt/apigee/customer/application/myCert.pem
chown apigee:apigee /opt/apigee/customer/application/myKey.pem
- 修改
/opt/apigee/customer/application/router.properties
。 如果该文件不存在,请创建一个。 - 将以下属性添加到该文件,以便您指定默认证书/密钥:
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 - 在
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
- 重启路由器:
/opt/apigee/apigee-service/bin/apigee-service edge-router restart
- 对所有其余路由器重复上述步骤。
支持从 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:
- 在第一个 Message Processor 节点上,在编辑器中打开
/opt/apigee4/conf/apigee/message-processor/system.properties
文件。 - 在
system.properties
中将以下属性设置为 true:jsse.enableSNIExtension=true
- 重启消息处理器:
/opt/apigee4/bin/apigee-service message-processor restart
- 对所有其余的消息处理程序重复上述步骤。
为 Edge 4.16.01 及更高版本在 Edge 和后端之间启用 SNI
请按以下步骤启用 SNI:
- 在第一个消息处理器节点上,修改
/opt/apigee/customer/application/message-processor.properties
。 如果该文件不存在,请创建一个。 - 将以下属性添加到文件中:
conf_system_jsse.enableSNIExtension=true
- 重启消息处理器:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- 对所有其余的消息处理程序重复上述步骤。