配置从边缘到后端的 TLS(Cloud 和私有云)

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

API 代理充当公开端点到后端服务的映射。 虚拟主机定义了面向公众的 API 代理向应用公开的方式。例如,虚拟主机可确定是否可以使用 TLS 访问 API 代理。配置 API 代理时,请修改其 ProxyEndpoint 定义以配置其使用的虚拟主机。

TargetEndpoint 是 ProxyEndpoint 的出站对等项。TargetEndpoint 充当从 Edge 到后端服务的 HTTP 客户端。创建 API 代理时,您可以将其配置为使用零个或多个 TargetEndpoint。

了解详情:

配置 TargetEndpoint 或 TargetServer

如需配置 TargetEndpoint,请修改定义 TargetEndpoint 的 XML 对象。您可以通过以下方式修改 TargetEndpoint:修改 API 代理中定义 TargetEndpoint 的 XML 文件,或在 Edge 管理界面中进行修改。

如需使用 Edge 管理界面修改 TargetEndpoint,请执行以下操作:

  1. 登录 Edge 管理界面 (https://enterprise.apigee.com)。
  2. 选择要更新的 API 代理的名称。
  3. 选择开发标签页。
  4. 目标端点下,选择默认
  5. 在代码区域中,系统会显示 TargetEndpoint 定义,如下所示:
    <TargetEndpoint name="default">
      <Description/>
      <FaultRules/>
      <Flows/>
      <PreFlow name="PreFlow">
        <Request/>
        <Response/>
      </PreFlow>
      <PostFlow name="PostFlow">
        <Request/>
        <Response/>
      </PostFlow>
      <HTTPTargetConnection>
        <Properties/>
        <SSLInfo>
          <Enabled>true</Enabled>
          <TrustStore>ref://myTrustStoreRef</TrustStore>
        </SSLInfo>
        <URL>https://mocktarget.apigee.net</URL>
      </HTTPTargetConnection>
    </TargetEndpoint>
  6. 按照下文关于后端 TLS 配置中的说明配置信任库。
  7. 进行任意更改,然后保存代理。如果 API 代理已部署,保存它会使用新设置重新部署它。

请注意,TargetEndpoint 定义包含 name 属性。您可以使用 name 属性的值来配置 API 代理的 ProxyEndpoint 定义,以使用 TargetEndpoint。 如需了解详情,请参阅 API 代理配置参考文档

您可以将 TargetEndpoint 配置为引用 TargetServer,而不是显式目标网址。TargetServer 配置将具体的端点网址与 TargetEndpoint 配置分离。TargetServer 用于支持跨多个后端服务器实例的负载均衡和故障切换。

下面显示了一个 TargetServer 定义示例:

<TargetServer name="target1">
  <Host>mocktarget.apigee.net</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer> 

在 TargetEndpoint 定义的 <HTTPTargetConnection> 元素中,TargetServer 通过名称引用。 您可以配置一个或多个已命名的 TargetServer,如下所示。

<TargetEndpoint name="default">
  ...
  <HTTPTargetConnection>
    <LoadBalancer>
      <Server name="target1" />
      <Server name="target2" />
    </LoadBalancer>
    <Path>/test</Path>
  </HTTPTargetConnection>
  ...
</TargetEndpoint>

如需了解详情,请参阅跨后端服务器的负载均衡

关于与后端之间的 TLS 配置

在配置后端 TLS 访问权限之前,您应了解以下两点重要信息:

  1. 默认情况下,Edge 不会验证后端证书。您必须创建信任库,才能配置 Edge 来验证证书。
  2. 使用引用来指定 Edge 使用的密钥库或信任库。

下文介绍了这两种注意事项。

定义信任库以启用证书验证

通过 TargetEndpoint 或 TargetServer 发出 TLS 请求时,Edge 默认不会 验证从后端服务器收到的 TLS 证书。这意味着 Edge 不会验证以下内容:

  • 该证书已由受信任的 CA 签名。
  • 证书未过期。
  • 证书显示常用名。如果存在公用名,Edge 不会验证该公用名是否与网址中指定的主机名匹配。

如需配置 Edge 以验证后端证书,您必须执行以下操作:

  1. 在 Edge 上创建信任库。
  2. 将服务器的证书或证书链上传到信任库。 如果服务器证书由第三方签名,则您需要将完整的证书链(包括根 CA 证书)上传到信任库。 没有隐式信任的 CA。
  3. 将信任库添加到 TargetEndpoint 或 TargetServer 定义中。

如需了解详情,请参阅密钥库和信任库

例如:

<TargetEndpoint name="default">
  …
  <HTTPTargetConnection>
    <SSLInfo>
      <Enabled>true</Enabled>
      <TrustStore>ref://myTrustStoreRef</TrustStore>
    </SSLInfo>
    <URL>https://myservice.com</URL>
  </HTTPTargetConnection>
  …
</TargetEndpoint>

使用对密钥库或信任库的引用

以下示例展示了如何配置 TargetEndpoint 或 TargetServer 以支持 TLS。在配置 TLS 时,您需要在 TargetEndpoint 或 TargetServer 定义中指定信任库和密钥库。

Apigee 强烈建议您在 TargetEndpoints 或 TargetServer 定义中使用对密钥库和信任库的引用。使用引用的优势在于,您只需更新引用以指向其他密钥库或信任库,即可更新 TLS 证书。

TargetEndpoints 或 TargetServer 定义中对密钥库和信任库的引用与虚拟主机中的引用工作方式相同。

将 TargetEndpoint 或 TargetServer 转换为使用引用

您可能已有使用密钥库和信任库字面名称的 TargetEndpoint 或 TargetServer 定义。如需转换 TargetEndpoint 或 TargetServer 定义以使用引用,请执行以下操作:

  1. 更新 TargetEndpoint 或 TargetServer 定义以使用引用。
  2. 重启 Edge 消息处理器:
    • 对于公有云客户,请与 Apigee Edge 支持团队联系以重启消息处理器。
    • 对于私有云客户,请一次重启一个 Edge 消息处理器。
  3. 确认您的 TargetEndpoint 或 TargetServer 正常运行。

为后端服务器配置单向 TLS

使用 TargetEndpoint 定义时,配置从 Edge(TLS 客户端)到后端服务器(TLS 服务器)的单向 TLS 访问权限不需要在 Edge 上进行任何额外配置。后端服务器负责正确配置 TLS。

您只需确保 TargetEndpoint 定义中的 <URL> 元素通过 HTTPS 协议引用后端服务,并启用 TLS:

<TargetEndpoint name="default">
  …
  <HTTPTargetConnection>
    <SSLInfo>
      <Enabled>true</Enabled>
    </SSLInfo>
    <URL>https://myservice.com</URL>
  </HTTPTargetConnection>
  …
</TargetEndpoint>

如果您使用 TargetServer 定义后端服务,请在 TargetServer 定义中启用 TLS:

<TargetServer name="target1">
  <Host>mocktarget.apigee.net</Host>
  <Port>443</Port>
  <IsEnabled>true</IsEnabled>
  <SSLInfo>
    <Enabled>true</Enabled>
  </SSLInfo> 
</TargetServer> 

不过,如果您希望 Edge 验证后端证书,则必须创建一个包含后端证书或证书链的信任库。然后,在 TargetEndpoint 定义中指定信任库:

<TargetEndpoint name="default">
  …
  <HTTPTargetConnection>
    <SSLInfo>
      <Enabled>true</Enabled>
      <TrustStore>ref://myTrustStoreRef</TrustStore>
    </SSLInfo>
    <URL>https://myservice.com</URL>
  </HTTPTargetConnection>
  …
</TargetEndpoint>

或者在 TargetServer 定义中:

<TargetServer name="target1">
  <Host>mockserver.apigee.net</Host>
  <Port>443</Port>
  <IsEnabled>true</IsEnabled>
  <SSLInfo>
    <Enabled>true</Enabled>
    <TrustStore>ref://myTrustStoreRef</TrustStore>
  </SSLInfo> 
</TargetServer>

如需配置单向 TLS,请执行以下操作:

  1. 如果您要验证后端证书,请在 Edge 上创建信任库,并上传后端证书或 CA 链,如密钥库和信任库中所述。 在此示例中,如果您必须创建信任库,请将其命名为 myTrustStore
  2. 如果您创建了信任库,请使用以下 POST API 调用创建名为 myTrustStoreRef 的引用,指向您在上面创建的信任库:

    curl -X POST  -H "Content-Type:application/xml" https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/references \
      -d '<ResourceReference name="myTrustStoreRef">
        <Refers>myTrustKeystore</Refers>
        <ResourceType>KeyStore</ResourceType>
      </ResourceReference>' -u email:password
    
  3. 使用 Edge 管理界面更新 API 代理的 TargetEndpoint 定义(或者,如果您在 XML 中定义 API 代理,请修改代理的 XML 文件):
    1. 登录 Edge 管理界面 (https://enterprise.apigee.com)。
    2. 在 Edge 管理界面菜单中,选择 API
    3. 选择要更新的 API 代理的名称。
    4. 选择开发标签页。
    5. 目标端点下,选择默认
    6. 在代码区域中,修改 <HTTPTargetConnection> 元素以添加 <SSLInfo> 元素。 请务必指定正确的信任库引用,并将 <Enabled> 设置为 true:
      <TargetEndpoint name="default">
        …
        <HTTPTargetConnection>
          <SSLInfo>
            <Enabled>true</Enabled>
            <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://myservice.com</URL>
        </HTTPTargetConnection>
        …
      </TargetEndpoint>
    7. 保存 API 代理。如果 API 代理已部署,保存它会使用新设置重新部署它。

配置与后端服务器的双向 TLS

如果您想在 Edge(TLS 客户端)和后端服务器(TLS 服务器)之间支持双向 TLS,请执行以下操作:

  • 在 Edge 上创建密钥库,并上传 Edge 证书和私钥。
  • 如果您想验证后端证书,请在 Edge 上创建一个信任库,其中包含您从后端服务器收到的证书和 CA 链。
  • 更新引用后端服务器的所有 API 代理的 TargetEndpoint,以配置 TLS 访问权限。

使用密钥别名指定密钥库证书

您可以在同一密钥库中定义多个证书,每个证书都有自己的别名。 默认情况下,Edge 会使用密钥库中定义的第一个证书。

(可选)您可以配置 Edge 以使用 <KeyAlias> 属性指定的证书。 这样一来,您就可以为多个证书定义一个密钥库,然后在 TargetServer 定义中选择要使用的证书。如果 Edge 找不到别名与 <KeyAlias> 匹配的证书,则会使用默认操作,即选择密钥库中的第一个证书。

Edge for Public Cloud 用户必须与 Apigee Edge 支持团队联系,才能启用此功能。

配置双向 TLS

如需配置双向 TLS,请执行以下操作:

  1. 按照此处所述的步骤在 Edge 上创建密钥库,并上传证书和私钥:密钥库和信任库。 在此示例中,创建一个名为 myTestKeystore 的密钥库,该密钥库使用别名 myKey 作为证书和私钥的名称。
  2. 使用以下 POST API 调用,为上面创建的密钥库创建名为 myKeyStoreRef 的引用:

    curl -X POST  -H "Content-Type:application/xml" https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/references \
    -d '<ResourceReference name="myKeyStoreRef">
        <Refers>myTestKeystore</Refers>
        <ResourceType>KeyStore</ResourceType>
    </ResourceReference>' -u email:password
    

    此引用指定密钥库的名称,并将引用类型指定为 KeyStore

    使用以下 GET API 调用来查看引用:

    curl -X GET https://api.enterprise.apigee.com/v1/o/[org_name}/e/{env_name}/references/myKeyStoreRef /
    -u email:password
    
  3. 如果您想验证后端证书,请在 Edge 上创建信任库,并上传证书和 CA 链,如密钥库和信任库中所述。 在此示例中,如果您必须创建信任库,请将其命名为 myTrustStore
  4. 如果您创建了信任库,请使用以下 POST API 调用创建名为 myTrustStoreRef 的引用,指向您在上面创建的信任库:

    curl -X POST  -H "Content-Type:application/xml" https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/references \
    -d '<ResourceReference name="myTrustStoreRef">
        <Refers>myTrustKeystore</Refers>
        <ResourceType>KeyStore</ResourceType>
    </ResourceReference>' -u email:password
    
  5. 使用 Edge 管理界面更新 API 代理的 TargetEndpoint 定义(或者,如果您在 XML 中定义 API 代理,请修改代理的 XML 文件):
    1. 登录 Edge 管理界面 (https://enterprise.apigee.com)。
    2. 在 Edge 管理界面菜单中,选择 API
    3. 选择要更新的 API 代理的名称。
    4. 选择开发标签页。
    5. 目标端点下,选择默认
    6. 在代码区域中,修改 <HTTPTargetConnection> 元素以添加 <SSLInfo> 元素。请务必指定正确的密钥库和密钥别名,并将 <Enabled><ClientAuthEnabled> 元素都设置为 true:
      <TargetEndpoint name="default">
        ...
        <HTTPTargetConnection>
          <SSLInfo>
            <Enabled>true</Enabled>
            <ClientAuthEnabled>true</ClientAuthEnabled>
            <KeyStore>ref://myKeyStoreRef</KeyStore>
            <KeyAlias>myKey</KeyAlias>
          </SSLInfo>
          <URL>https://myservice.com</URL>
        </HTTPTargetConnection>
        ...
      </TargetEndpoint>
    7. 保存 API 代理。如果 API 代理已部署,保存它会使用新设置重新部署它。

如需详细了解 <TargetEndpoint> 中提供的选项,包括如何使用变量来提供 TargetEndpoint <SSLInfo> 值,请参阅 API 代理配置参考文档

启用 SNI

Edge 支持从消息处理器使用服务器名称指示 (SNI) 来定位 Apigee Edge for Cloud 和 Private Cloud 部署中的目标端点。

对于 Edge for Private Cloud,为了向后兼容现有目标后端,Apigee 默认停用了 SNI。如果您的目标后端配置为支持 SNI,则可以启用此功能。如需了解详情,请参阅将 SNI 与 Edge 搭配使用