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

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

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

  • Cloud:從 Pantheon 或 Acquia (入口網站的雲端式託管服務) 設定 TLS。
  • Apigee Edge for Private Cloud:在託管入口網站的伺服器上設定傳輸層安全標準 (TLS)。

TLS 和入口網站

下圖顯示入口網站使用傳輸層安全標準 (TLS) 的兩個位置:

  1. 用於入口網站和 Edge Management API 之間的通訊。

    入口網站無法做為獨立系統。而是會將入口網站使用的大部分資訊儲存在 Edge 中。Edge 可將 Edge 部署在雲端或地端部署環境中,當做私有雲安裝。必要時,入口網站會向 Edge Management API 發出 HTTP 或 HTTPS 要求,藉此擷取資訊或傳送資訊。

    建立入口網站時,您必須執行的第一步之一是指定 Edge Management API 網址。視 Edge Management API 的設定方式而定,網址可以使用傳輸層安全標準 (TLS)。詳情請參閱「建立開發人員入口網站」。
  2. 用於開發人員和入口網站之間的通訊。

    使用 Developer Services 入口網站部署 API 時,開發人員請登入入口網站註冊應用程式並接收 API 金鑰。登入憑證和 API 金鑰是您可以透過 HTTPS 傳送的專屬資訊,以確保安全。這類專屬資訊應透過 HTTPS 傳送。

    您為此情境設定 TLS 的方式取決於您部署入口網站的方式:Cloud 或 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 的私有雲

如要安裝 Private Cloud 的 Private Cloud,Edge Management API 的網址格式為:
http://EdgePrivateCloudIp:8080/v1
或:
https://EdgePrivateCloudIp:TLSport/v1

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

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

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

雲端式入口網站

Pantheon

Pantheon 會透過 Pantheon Global CDNLet's Encrypt,為平台上的所有網站提供免費自動 HTTPS。另請參閱 Pantheon 的 Global CDN 上的 HTTPS

Acquia

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

私人雲端入口網站邊緣

所有 Apigee 建議的入口網站私人雲端安裝作業,入口網站都必須位於負載平衡器後方,如下所示:

因此,針對地端部署安裝,您有兩種方法可以設定 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 (雲端) 或 sites/default/settings.php (Private Cloud) 檔案中設定下列屬性:

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

    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 (Private Cloud) 檔案。由於負載平衡器不會自動轉換 HTML 頁面的內容,因此程式碼可確保傳送至用戶端的所有連結的開頭都是 https://

如要透過負載平衡器設定傳輸層安全標準 (TLS),請在 sites/default/settings.local.php (雲端) 或 sites/default/settings.php (Private Cloud) 檔案中加入以下程式碼:

// 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 (Private Cloud) 檔案,將所有入口網站流量重新導向至 HTTPS。視您重新導向至相同主機名稱還是多個主機名稱的 HTTPS 而定,需要更新的項目會有所不同。

重新導向至相同主機名稱的 HTTPS

將下列程式碼新增到您的 sites/default/settings.local.php (雲端) 或 sites/default/settings.php (Private Cloud) 檔案,以便重新導向至同一個主機名稱 (例如 *.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 檔案 (Private Cloud),以便重新導向至多個主機名稱上的所有入口網站流量。

  // 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;
  }
}