为 API BaaS 配置 TLS

Edge for Private Cloud v4.18.01

TLS(传输层安全协议,其前身是 SSL)是一种标准安全技术,可确保在 API 环境中进行安全、加密的消息传递。您可以在 API BaaS 门户和 API BaaS Stack 节点上配置 TLS。

下图显示了 API BaaS 的典型部署图,其中包含一个 BaaS 门户节点和三个 API BaaS 堆栈节点。

开发者使用浏览器向门户发出请求。默认情况下,请求在 Portal 节点的端口 9000 上使用 HTTP 协议。

此部署在 Portal 节点和 Stack 节点之间包含一个负载均衡器。在此配置中,Portal 会向负载均衡器发出 HTTP 请求,然后负载均衡器会将请求转发到其中一个 Stack 节点。这是生产系统的推荐部署环境。

TLS 配置选项

为 API BaaS 配置 TLS 时,您有以下几种选择:

  • 在门户和 Stack 节点的负载均衡器上配置 TLS

    在此配置中,开发者使用 HTTPS 协议访问门户,在浏览器中运行的门户使用 HTTPS 通过负载均衡器向 Stack 节点发出请求。负载均衡器使用 HTTP 访问 Stack 节点。
  • 在门户、负载均衡器和 Stack 节点上配置 TLS

    为了提高安全性,请将负载均衡器配置为使用 TLS 访问 Stack 节点。
  • 在门户和单个 Stack 节点上配置 TLS

    在小型环境(例如测试或开发环境)中,您可能只有一个 Stack 节点,这意味着无需添加负载均衡器。在此配置中,请在 Portal 和 Stack 节点上配置 TLS。
  • 在负载均衡器上为门户配置 TLS

    上面未显示的一个选项是在门户节点前面使用负载均衡器。在该配置中,您可以在负载均衡器上配置 TLS,也可以选择在负载均衡器与门户之间的连接上配置 TLS。

确保 TLS 端口已打开

以下过程在默认门户端口 9000 和 Stack 节点 8080 上配置 TLS。 不过,您可以根据需要更改此端口。

无论您使用哪个端口,都必须确保该端口在节点上处于打开状态。例如,您可以使用以下命令打开端口 8443:

$ iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8443 -j ACCEPT --verbose

在 API BaaS 堆栈上配置 TLS

默认情况下,API BaaS 堆栈停用 TLS。然后,您可以使用 Stack 节点的 IP 地址或 DNS 名称以及端口 8080,通过 HTTP 访问 BaaS API。例如:

http://stack_IP:8080

或者,您可以配置对 BaaS API 的 TLS 访问权限,以便通过以下形式访问它:

https://stack_IP:8080

在此示例中,您将 TLS 访问配置为使用端口 8080。不过,端口 8080 并非必需,您可以将 Stack 配置为使用其他端口。唯一的要求是您的防火墙允许通过指定端口传输流量。

该堆栈只能通过单个端口支持一种类型的请求(HTTP 或 HTTPS)。因此,如果您在端口 8080 上配置了 HTTPS 访问权限,则无法使用 HTTP 访问端口 8080。如果您将 Stack 配置为通过 HTTPS 使用端口 8443,则 Stack 将不再监听端口 8080。

请按照以下步骤配置对 Stack 的 TLS 访问权限:

  1. 生成包含 TLS 证书和私钥的密钥库 JKS 文件。如需了解详情,请参阅为 Edge for Private Cloud 配置 TLS/SSL。
    注意:确保密钥库和密钥的密码相同。
  2. 将密钥库 JKS 文件复制到 Stack 节点上的目录,例如 /opt/apigee/customer/application。 “apigee”用户必须能够访问该目录。
  3. 将 JKS 文件的所有权更改为“apigee”用户:
    > chown apigee:apigee /opt/apigee/customer/application/keystore.jks

    其中 keystore.jks 是密钥库文件的名称。
  4. 修改 /opt/apigee/customer/application/usergrid.properties 文件以设置以下属性,包括 JKS 文件的路径以及密钥库和密钥的密码。如果该文件不存在,请创建它:
    tomcat-server_scheme=https
    tomcat-server_secure=true
    tomcat-server_ssl.enabled=true
    tomcat-server_keystore.type=JKS
    tomcat-server_keystore.file=/opt/apigee/customer/application/keystore.jks
    tomcat-server_keystore.password=password
    tomcat-server_keyalias=keystore_alias
    tomcat-server_clientauth.enabled=false
    tomcat-server_ssl.protocols=TLSv1,TLSv1.1,TLSv1.2
    # By default, TLS access uses port 8080.
    # 使用此属性指定其他端口。
    # tomcat-server_port=8080


    警告:password 值必须为明文。 因此,您应该保护 usergrid.properties 免遭未经授权的访问。

    使用 tomcat-server_keyalias 属性指定密钥库别名。您在创建密钥时设置了密钥别名。 例如,您可以使用 keytool 命令的 -alias 选项来设置别名。

    使用 tomcat-server_ssl.protocols 设置堆栈支持的 TLS 协议。如需查看 Java 8 支持的协议列表,请参阅 http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#jssename。
  5. 配置 Stack 节点:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid configure
  6. 重启 BaaS 堆栈:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart
  7. 在 Stack 节点上使用 HTTPS 运行以下 cURL 命令,确认 TLS 正常运行:
    > curl -k https://localhost:8080/status -v

    如果 TLS 配置正确,您应该会看到包含状态信息的响应。

    如果您通过 8080 以外的端口配置了 TLS 访问,请修改上述命令以使用正确的端口。
  8. 在所有 Stack 节点上重复此操作。
  9. 如果您在 Stack 节点前面有负载均衡器,请将负载均衡器配置为通过 HTTPS 向 Stack 节点发出请求。如需了解详情,请参阅负载均衡器的相关文档。

    如果门户直接向 Stack 发出请求,请按照以下部分中的说明,将门户配置为通过 HTTPS 访问 Stack。
  10. 请按照下文“在 Stack 或 Portal 上为 TLS 配置 API BaaS Stack 节点”中的步骤操作,确保 Stack 节点在生成用户响应时具有正确的 TLS 网址。

将 Portal 配置为通过 TLS 访问 Stack

在浏览器中运行的 BaaS 门户通过向 BaaS 堆栈发出 API 调用来运行。如果您将 BaaS 堆栈配置为使用 TLS,则还必须将门户配置为通过 HTTPS 进行这些调用。

API BaaS 安装通常配置为:

  • 在 Portal 和 Stack 节点之间使用负载均衡器

    配置负载均衡器,以通过 HTTPS 向 Stack 节点发出请求。如需了解详情,请参阅负载均衡器的相关文档。

    在此配置中,门户可以通过 HTTP 或 HTTPS 访问负载均衡器,具体取决于您如何配置负载均衡器。如果负载均衡器使用 TLS,请按照以下步骤配置门户,以便向 HTTPS 负载均衡器发出请求。
  • 让门户直接向 Stack 发出请求

    按照下文所述,将门户配置为通过 HTTPS 访问 Stack。

使用以下过程配置 API BaaS 门户,以通过 HTTPS 进行 API 调用:

  1. 按照上述说明在 BaaS 堆栈上配置 TLS 访问权限,或按照负载均衡器文档中的说明在堆栈节点的负载均衡器上配置 TLS 访问权限。
  2. 修改 /opt/apigee/customer/application/portal.properties 以设置以下属性。如果该文件不存在,请创建它:
    baas.portal.config.overrideUrl=https://stackIP:port

    对于单节点安装,请将此属性的值指定为 API Stack 节点的 IP 地址或 DNS 名称和端口;如果您在 API BaaS Stack 节点前面有负载均衡器,请指定为负载均衡器的 IP 地址或 DNS 名称和端口。
  3. 配置门户节点:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal configure
  4. 使用以下命令重启门户:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart
  5. 如果您在配置对上述 Stack 的 TLS 访问权限时使用了自签名证书,则浏览器可能不允许从 Portal 向 Stack 发出请求。如果您在浏览器中看到不允许通过 HTTPS 访问 Stack 的错误,请在浏览器中请求以下网址,并添加安全例外以允许访问:
    https://stackIP:port/status

    指定 API Stack 节点或负载均衡器的 IP 地址或 DNS 名称和端口。

在 API BaaS 门户上配置 TLS

默认情况下,用户通过在 Portal 服务器上的端口 9000 上发出未加密的 HTTP 请求来访问 Portal。您可以将门户配置为使用 HTTPS 来加密发送到门户和从门户发送的数据。

默认情况下,您可以使用 Portal 节点的 IP 地址或 DNS 名称以及端口 9000 通过 HTTP 访问 Portal。例如:

http://portal_IP:9000

或者,您可以配置对门户的 TLS 访问权限,以便通过以下形式访问门户:

https://portal_IP:9443

在此示例中,您将 TLS 访问配置为使用端口 9443。不过,端口 9443 并非必需,您可以将门户配置为使用其他端口。

Portal 只能通过单个端口支持一种类型的请求(HTTP 或 HTTPS)。因此,如果您在端口 9000 上配置了 HTTPS 访问权限,则无法使用 HTTP 访问端口 9000。如果您将门户配置为通过 HTTPS 使用端口 9443,则门户将不再监听端口 9000。

如需为门户配置 TLS,请执行以下操作:

  1. 创建 PEM 格式的密钥文件和证书文件。
    注意:确保密钥或证书上没有密码/口令。
  2. 将 PEM 文件复制到门户节点上的目录,例如 /opt/apigee/customer/application。 “apigee”用户必须能够访问该目录。
  3. 将 PEM 文件的所有权更改为“apigee”用户:
    > chown apigee:apigee /opt/apigee/customer/application/*.PEM
  4. 修改 /opt/apigee/customer/application/portal.properties 文件以设置以下属性。如果该文件不存在,请创建该文件:
    baas.portal.ssl=on
    baas.portal.ssl.certificate=/opt/apigee/customer/application/defaultcert.pem
    baas.portal.ssl.key=/opt/apigee/customer/application/defaultkey.pem
    baas.portal.ssl.protocols=TLSv1 TLSv1.1 TLSv1.2
    # By default, TLS access uses port 9000.
    # 使用此属性指定其他端口。
    # baas.portal.listen=9000


    使用 baas.portal.ssl.protocols 设置门户支持的 TLS 协议。如需查看支持的协议列表,请参阅 Nginx 定义的 SSL 协议名称列表:http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols。
  5. 配置门户节点:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal configure
  6. 重启门户:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart
  7. 请使用下文“在堆栈或门户上为 TLS 配置 API BaaS 堆栈节点”中的过程,确保堆栈节点具有门户的正确 TLS 网址。

在堆栈或门户上为 TLS 配置 API BaaS 节点

如果您在 Stack 或 Portal 节点前面添加了负载均衡器,或者直接在 Portal 或 Stack 节点上启用了 TLS,则必须为节点配置正确的网址,以便访问 Stack 和 Portal。例如,在以下情况下,Stack 节点需要此信息:

  • 在 BaaS API 请求的响应中包含网址。
  • 在重置密码或发送其他通知时,在电子邮件模板中添加链接。
  • 将用户重定向到特定门户页面。

如果您在 Stack 节点前面使用负载均衡器,或在 Stack 节点上配置 TLS,请在 /opt/apigee/customer/application/usergrid.properties 中设置以下属性:

usergrid-deployment_usergrid.api.url.base=http://localhost:8080

将 http://localhost:8080 替换为负载均衡器的网址。如果负载均衡器配置为使用 TLS,请使用 HTTPS 协议。只有在使用非标准端口(即 HTTP 端口 80 和 HTTPS 端口 443 以外的端口)时,才需要添加端口。

如果您在 Stack 节点前面使用负载均衡器,则还必须在 /opt/apigee/customer/application/portal.properties 中设置以下属性:

baas.portal.config.overrideUrl=http://localhost:8080

将 http://localhost:8080 替换为 Stack 的负载均衡器的网址。

如果您在 Portal 节点前面使用负载均衡器,或在 Stack 节点上配置 TLS,请在 usergrid.properties 中设置以下属性:

usergrid-deployment_portal.url=http://localhost:9000

将 http://localhost:9000 替换为负载均衡器的网址。如果负载均衡器配置为使用 TLS,请使用 HTTPS 协议。只有在使用非标准端口(即 HTTP 端口 80 和 HTTPS 端口 443 以外的端口)时,才需要添加端口。

修改 usergrid.properties 后:

  1. 配置 Stack 节点:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid configure
  2. 重启 BaaS 堆栈:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart
  3. 如果您修改了 portal.properties,请配置门户节点:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal configure
  4. 重启 BaaS 门户:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart