在入口網站上使用傳輸層安全標準 (TLS)

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

您可以將入口網站設為使用 TLS。入口網站的 TLS 設定程序取決於入口網站的部署方式:

  • Cloud:從 Pantheon 或 Acquia 設定 TLS,這是入口網站的雲端代管服務。
  • Apigee Edge for Private Cloud:在代管入口網站的伺服器上,於地端部署環境設定 TLS。

傳輸層安全標準 (TLS) 和入口網站

下圖顯示入口網站使用 TLS 的兩個位置:

  1. 用於入口網站與 Edge 管理 API 之間的通訊。

    入口網站並非獨立系統,不過,入口網站使用的許多資訊實際上都儲存在 Edge 中,而 Edge 可部署在雲端或地端部署,做為私有雲安裝。必要時,入口網站會向 Edge 管理 API 發出 HTTP 或 HTTPS 要求,以擷取或傳送資訊。

    建立入口網站時,您必須執行的第一步是指定 Edge 管理 API 的網址。視 Edge 管理 API 的設定方式而定,該網址可以使用 TLS。詳情請參閱「建立開發人員入口網站」。
  2. 開發人員與入口網站之間的通訊。

    使用開發人員服務入口網站部署 API 時,開發人員會登入入口網站註冊應用程式並取得 API 金鑰。登入憑證和 API 金鑰是專屬資訊,您希望透過 HTTPS 傳送這些資訊,確保安全無虞。這類專有資訊應透過 HTTPS 傳送。

    在這個情境中,設定 TLS 的方式取決於入口網站的部署方式:雲端或 Apigee Edge for Private Cloud。以下各節將說明這兩種情境。

在入口網站和 Edge 管理 API 之間設定 TLS

Edge 管理 API 的設定會決定通訊是否可以使用 TLS。如果 Edge 管理 API 設定為使用 TLS,入口網站就能使用 HTTPS。否則,入口網站會透過 HTTP 與 Edge 通訊。因此,入口網站開發人員只需要瞭解 Edge 的設定方式,即可設定入口網站與 Edge 之間的連線。

如需設定 Edge Management API 連線的程序,請參閱建立開發人員入口網站

雲端版 Edge

如果入口網站連線至雲端版 Edge,Apigee 會預先設定 Edge 管理 API 的網址,以使用 TLS。設定入口網站時,您可以使用網址 https://api.enterprise.apigee.com/v1 存取 Edge 管理 API。

在私有雲中安裝 Edge

如果是 Edge 私有雲安裝,Edge 管理 API 的網址格式如下:
http://EdgePrivateCloudIp:8080/v1
或:
https://EdgePrivateCloudIp:TLSport/v1

其中 EdgePrivateCloudIp 是 Edge Management Server 伺服器的 IP 位址,TLSport 則是 Edge 管理 API 的 TLS 連接埠。舉例來說,通訊埠編號可能是 8443,甚至可能是 8080 (視 Edge 設定而定)。

在開發人員和入口網站之間設定 TLS

開發人員與入口網站之間的 TLS 設定方式,取決於入口網站的部署方式:雲端或 Apigee Edge for Private Cloud。

雲端入口網站

Pantheon

Pantheon 會透過 Pantheon Global CDN 並使用 Let's Encrypt,為平台上的所有網站提供免費的自動 HTTPS。另請參閱「Pantheon 全球 CDN 上的 HTTPS」。

Acquia

如要使用 Acquia 啟用 TLS/SSL,請參閱「啟用 SSL」。

Edge for Private Cloud 入口網站

如要安裝 Apigee 建議的入口網站 Private Cloud,入口網站必須位於負載平衡器後方,如下所示:

因此,如果是地端部署,您有兩種設定 TLS 的方式:

  • 在負載平衡器上設定 TLS:在負載平衡器本身設定 TLS,而非在入口網站上設定。因此,您用來設定 TLS 的程序取決於負載平衡器。詳情請參閱負載平衡器的說明文件。
  • 在入口網站本身設定 TLS:如有需要,您可以在託管入口網站的網路伺服器上設定 TLS。詳情請參閱「設定入口網站以使用 HTTPS」。

您必須先取得自己的 TLS 憑證,才能將入口網站部署到實際工作環境。

設定其他 TLS 設定

您可以編輯 sites/default/settings.local.php (雲端) 或 sites/default/settings.php (Private Cloud) 檔案,變更入口網站的 TLS 設定。

編輯檔案時,請新增 ini_set() 函式的例項,設定屬性。 如要進一步瞭解這項函式,請參閱:http://php.net/manual/en/function.ini-set.php

您可以在 sites/default/settings.local.php (Cloud) 或 sites/default/settings.php (Private Cloud) 檔案中設定下列屬性:

  • cookie_httponly: (建議) 指定 Cookie 只能透過 HTTP 通訊協定存取。將這項屬性設為:

    ini_set('session.cookie_httponly', true);
  • session.cookie_secure - (選用) 指定 Cookie 只能透過安全連線傳送。不過,這表示所有內容都必須透過 HTTPS 提供。如果啟用這項設定,網站就無法透過 HTTP 運作。將這項屬性設為:

    ini_set('session.cookie_secure', true);
  • gc_maxlifetimecookie_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 (雲端) 或 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) 的 HTTPS。

在這種情況下,如果開發人員造訪的入口網站是 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;
  }
}