在门户上使用 TLS

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

您可以将门户配置为使用 TLS。门户的 TLS 配置过程取决于您部署该门户的方式:

  • :通过 Pantheon 或 Acquia(一种面向门户的云端托管服务)配置 TLS。
  • 适用于私有云的 Apigee Edge:在托管门户的服务器上配置本地 TLS。
。 <ph type="x-smartling-placeholder">

TLS 和门户

下图显示了该门户在两个位置使用 TLS:

  1. 用于门户与 Edge Management API 之间的通信。

    门户不能作为独立系统运行。相反,该门户使用的大部分信息实际上存储在 Edge 上,因此 Edge 可以作为私有云安装部署在云端或本地。必要时,门户会向 Edge Management API 发出 HTTP 或 HTTPS 请求,以检索信息或发送信息。

    创建门户时,您必须执行的首要步骤之一是指定 Edge Management API 的网址。该网址可以使用 TLS,具体取决于 Edge Management API 的配置方式。如需了解详情,请参阅开始构建开发者门户
  2. 用于开发者与门户之间的通信。

    当您使用开发者服务门户部署 API 时,您的开发者会登录该门户来注册应用并接收 API 密钥。登录凭据和 API 密钥是您希望通过 HTTPS 发送的专有信息,以确保其安全性。此类专有信息应通过 HTTPS 发送。

    为此场景配置 TLS 的方式取决于您部署门户的方式:云端版或适用于私有云的 Apigee Edge。以下部分介绍了这两种情况。

在门户和 Edge Management API 之间配置 TLS

Edge Management API 的配置决定通信是否可以使用 TLS。如果将 Edge Management API 配置为使用 TLS,则此门户可以使用 HTTPS。否则,门户将通过 HTTP 与 Edge 进行通信。因此,作为门户开发者,您只需了解如何配置 Edge 才能设置门户与 Edge 之间的连接。

如需了解用于配置与 Edge Management API 的连接的过程,请参阅开始构建开发者门户

基于云的 Edge 版本

如果您的门户连接到基于云的 Edge 版本,则 Apigee 会预先将 Edge Management API 的网址配置为使用 TLS。在配置门户时,您可以使用网址 https://api.enterprise.apigee.com/v1 访问 Edge Management API。

Edge 的私有云安装

在安装 Edge 的私有云中,Edge Management API 的网址采用以下格式:
http://EdgePrivateCloudIp:8080/v1?
或者:
https://EdgePrivateCloudIp:TLSport/v1

其中,EdgePrivateCloudIp 是边缘管理服务器服务器的 IP 地址,TLSport 是 Edge Management API 的 TLS 端口。例如,根据 Edge 配置,端口号可能是 8443 甚至是 8080。

在开发者和门户之间配置 TLS

在开发者与门户之间配置 TLS 的方式取决于您部署门户的方式:云端或适用于私有云的 Apigee Edge。

云端门户

万神殿

Pantheon 通过 Pantheon 全球 CDNLet's Encrypt 为其平台上的所有网站提供免费的自动 HTTPS。另请参阅 Pantheon 全球 CDN 上的 HTTPS

Acquia

要使用 Acquia 启用 TLS/SSL,请参阅启用 SSL

适用于私有云门户的 Edge

所有 Apigee 推荐的私有云安装都需要门户位于负载平衡器后面,如下所示:

因此,对于本地安装,您可以通过以下两种方式配置 TLS:

  • 在负载平衡器上配置 TLS:在负载平衡器本身(而不是在门户上)配置 TLS。因此,用于配置 TLS 的过程取决于负载平衡器。如需了解详情,请参阅关于您的负载平衡器的文档。
  • 在门户上配置 TLS:如有必要,您可以在托管该门户的网络服务器上配置 TLS。默认情况下,Apigee 会安装 Apache Web 服务器。如需了解如何为 Apache 配置 TLS,请参阅启用 HTTP 安全协议 (HTTPS)

您必须先获取自己的 TLS 证书,然后才能将该门户部署到生产环境。

配置其他 TLS 设置

您可以修改 sites/default/settings.local.php (云)或 sites/default/settings.php (私有云)文件,以更改门户的 TLS 配置。

编辑文件时,请添加 ini_set() 函数的实例以设置属性。如需详细了解此函数,请参阅:ini_set

您可以在 sites/default/settings.local.php (cloud) 或 sites/default/settings.php (私有云)文件中设置以下属性:

  • cookie_httponly:(推荐)将该 Cookie 指定为仅可通过 HTTP 协议访问。将此属性设置为:

    ini_set('session.cookie_httponly', true);
  • session.cookie_secure -(可选)指定只能通过安全连接发送 Cookie。不过,这意味着所有内容都必须采用 HTTPS 协议。启用此设置后,网站将无法通过 HTTP 运行。将此属性设置为:

    ini_set('session.cookie_secure', true);
  • gc_maslifetimecookie_lifetime:(可选)gc_lifeteime 指定可能清理数据的秒数,cookie_lifetime 指定 Cookie 生命周期(以秒为单位)。将这些属性设置为:

    ini_set('session.gc_maxlifetime', 3600);
    ini_set('session.cookie_lifetime', 3600);

如需详细了解如何在开发者门户和客户端之间设置 TLS,请参阅 Pantheon 文档网站上的启用 SSL 以确保安全的 HTTPS 通信

使用负载平衡器配置 TLS

为了获得更好的性能,负载平衡器有时会配置为执行 TLS 终止。借助 TLS 终止,负载平衡器可解密通过 https:// 发送的消息,并通过 http:// 将消息转发到后端服务器。这样可以节省后端服务器自行解密 https:// 消息的开销。

如果负载平衡器将未加密的 http 消息转发到同一数据中心内的服务器,就不存在安全性问题。但是,如果负载平衡器通过 http:// 将消息转发到数据中心外的服务器(例如 Apigee 开发者门户),则消息不会被加密,从而造成安全漏洞。

如果您的开发者门户位于使用 TLS 终止功能的负载平衡器后面,并且您希望所有流量都通过 https:// 传送,那么网页将只需要包含 https:// 链接,并且您需要将以下代码添加到开发者门户 sites/default/settings.local.php (cloud) 或 sites/default/settings.php (私有云)文件中。由于负载平衡器不会自动转换 HTML 网页的内容,因此该代码确保传递到客户端的所有链接都以 https:// 开头。

要使用负载平衡器配置 TLS,请将以下行添加到 sites/default/settings.local.php(云)或 sites/default/settings.php(私有云)文件中:

// Only check for SSL if we are not using PHP from the command line.
if (PHP_SAPI != 'cli') {
  // Assume we can't detect SSL unless proven otherwise.
  $can_detect_ssl = FALSE;

  // Set HTTPS URL of portal
  $base_url = 'https://developers.myCo.com';

  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
    $can_detect_ssl = TRUE;
  }

  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') {
    $_SERVER['HTTPS'] = 'on';
  }

  if ($can_detect_ssl && $_SERVER['HTTPS'] != 'on') {
    header('HTTP/1.0 301 Moved Permanently');
    // You could optionally substitute a canonical server name for $_SERVER['HTTP_HOST'] here.
    header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    exit;
  }
}

如需了解详情,请参阅:

将门户流量重定向到 HTTPS

您可以通过更新 sites/default/settings.local.php(云)或 sites/default/settings.php(私有云)文件,将所有门户流量重定向到 HTTPS。所需的更新取决于您要重定向到相同主机名还是多个主机名的 HTTPS。

重定向到同一主机名上的 HTTPS

将以下代码添加到您的 sites/default/settings.local.php(云)或 sites/default/settings.php(私有云)文件中,以重定向到同一主机名(例如 *.devportal.apigee.io)上的所有门户流量。

在这种情况下,如果开发者在 live-example.devportal.apigee.io 访问您的门户,但需要访问为 devportal.example.com 上传的证书,则请求将失败。

// Only check for SSL if we are not using PHP from the command line.
if (PHP_SAPI != 'cli') {
  // Assume we can't detect SSL unless proven otherwise.
  $can_detect_ssl = FALSE;

  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
    $can_detect_ssl = TRUE;
  }

  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') {
    $_SERVER['HTTPS'] = 'on';
  }

  if ($can_detect_ssl && $_SERVER['HTTPS'] != 'on') {
    header('HTTP/1.0 301 Moved Permanently');
    header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    exit;
  }
}

在多个主机名上重定向到 HTTPS

将以下代码添加到您的 sites/default/settings.local.php 文件(云)或 sites/default/settings.php 文件(私有云)中,以重定向到多个主机名上 HTTPS 的所有门户流量。

  // Only check for SSL if we are not using PHP from the command line.
if (PHP_SAPI != 'cli') {
  // Assume we can't detect SSL unless proven otherwise.
  $can_detect_ssl = FALSE;
  // Assume we are not forcing a redirect until proven otherwise.
  $force_redirect = FALSE;

  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
    $can_detect_ssl = TRUE;
  }

  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') {
    $_SERVER['HTTPS'] = 'on';
  }

  if ($can_detect_ssl && $_SERVER['HTTPS'] != 'on') {
    // We will force a redirect because HTTPS is required.
    $force_redirect = TRUE;
  }

  // This works on Pantheon only; the constant is undefined elsewhere.
  switch (PANTHEON_ENVIRONMENT) {
    case 'dev':
      $canonical_hostname = 'dev.devportal.example.com';
      break;
    case 'test':
      $canonical_hostname = 'test.devportal.example.com';
      break;
    case 'live':
      $canonical_hostname = 'devportal.example.com';
      break;
    default:
      $canonical_hostname = strtolower($_SERVER['HTTP_HOST']);
      break;
  }
  if ($canonical_hostname != strtolower($_SERVER['HTTP_HOST'])) {
    // We will force a redirect because hostname is not canonical.
    $force_redirect = TRUE;
  }

  if ($force_redirect) {
    header('HTTP/1.0 301 Moved Permanently');
    header('Location: https://' . $canonical_hostname . $_SERVER['REQUEST_URI']);
    exit;
  }
}