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

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

您可以將入口網站設為使用傳輸層安全標準 (TLS)。入口網站的 TLS 設定程序取決於您部署入口網站的方式:

  • 雲端:從 Pantheon 或 Acquia (入口網站的雲端式託管服務) 設定 TLS。
  • Apigee Edge for Private Cloud:在託管入口網站的伺服器中設定傳輸層安全標準 (TLS)。
,瞭解如何調查及移除這項存取權。 ,瞭解如何調查及移除這項存取權。

TLS 和入口網站

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

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

    入口網站無法做為獨立系統。相反地,入口網站使用的大部分資訊實際上會儲存在 Edge 上,因此 Edge 可部署到雲端或內部部署,做為 Private Cloud 安裝。必要時,入口網站會向 Edge Management API 發出 HTTP 或 HTTPS 要求,以擷取資訊或傳送資訊。

    建立入口網站時,您必須執行的第一步是指定 Edge Management API 網址。視 Edge Management API 的設定方式而定,這個網址可以使用 TLS。詳情請參閱「開始建構開發人員入口網站」。
  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 的私人雲端安裝

如果您是從 Private Cloud 安裝 Edge,則 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 的方式,取決於您部署入口網站的方式:雲端或私有雲的 Apigee Edge。

雲端入口網站

Pantheon

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

Acquia

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

Edge for Private Cloud 入口網站

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

因此,針對地端部署安裝作業,您有兩種設定 TLS 的方法:

  • 在負載平衡器上設定 TLS:請在負載平衡器本身設定 TLS,而非在入口網站上設定。因此,用來設定 TLS 的程序會因負載平衡器而異。詳情請參閱負載平衡器的說明文件。
  • 在入口網站上設定 TLS:如有需要,您可以在代管入口網站的網路伺服器上設定 TLS。根據預設,Apigee 會安裝 Apache 網路伺服器。如要瞭解如何為 Apache 設定 TLS,請參閱啟用 HTTP 安全 (HTTPS) 一文

您必須先取得自己的 TLS 憑證,才能將入口網站部署至正式環境。

指定其他 TLS 設定

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

在編輯檔案時,新增 ini_set() 函式的執行個體來設定屬性。如要進一步瞭解這個函式,請參閱:ini_set

您可以在 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_maslifetimecookie_lifetime:(選用) gc_lifeteime 會指定 Cookie 的生命週期秒數,而 cookie_lifetime 則指定 Cookie 的效期 (以秒為單位)。將這些屬性設為:

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

如要進一步瞭解如何在開發人員入口網站和用戶端之間設定 TLS,請參閱 Pantheon 文件網站上的「為安全的 HTTPS 通訊啟用 SSL」一文。

設定負載平衡器的 TLS

為提高效能,負載平衡器有時會設定執行 TLS 終止作業。啟用 TLS 終止功能時,負載平衡器會解密透過 https:// 傳送的訊息,並透過 http:// 將郵件轉送至後端伺服器。這樣可以節省後端伺服器自行解密 https:// 訊息的負擔。

如果負載平衡器將未加密的 http 訊息轉送至同一個資料中心內的伺服器,則不必擔心安全性的問題。不過,如果負載平衡器透過 http:// 將訊息轉寄至資料中心以外的伺服器 (例如 Apigee 開發人員入口網站),訊息就不會經過加密,因而開啟安全性漏洞。

如果開發人員入口網站位於使用 TLS 終止功能的負載平衡器後方,而且您希望所有流量透過 https:// 提供,那麼網站上只需包含 https:// 連結,且您必須將下列程式碼新增至開發人員入口網站 sites/default/settings.local.php (cloud) 或 sites/default/settings.php (Private Cloud) 檔案。由於負載平衡器不會自動轉換 HTML 網頁的內容,因此程式碼可確保傳遞至用戶端的所有連結開頭都是 https://

如要為負載平衡器設定 TLS,請在 sites/default/settings.local.php (cloud) 或 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 (cloud) 或 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),以便將流量重新導向至多個主機名稱上的 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;
  }
}