為 API BaaS 設定傳輸層安全標準 (TLS)

Edge for Private Cloud 4.17.01 版

TLS (傳輸層安全標準,前身為 SSL) 是標準安全技術,可確保 API 環境中的訊息加密安全。您可以在 API BaaS Portal 和 API BaaS Stack 節點上設定 TLS。

下圖顯示 API BaaS 的典型部署圖表,其中包含單一 BaaS Portal 節點和三個 API BaaS Stack 節點。

開發人員使用瀏覽器向入口網站提出要求。根據預設,要求會使用 Portal 節點的 9000 連接埠上的 HTTP 通訊協定。

這個部署作業會在入口網站和堆疊節點之間有一個負載平衡器。在這個設定中,Portal 會向負載平衡器提出 HTTP 要求,而負載平衡器則會將要求轉送至其中一個堆疊節點。這是正式系統的建議部署環境。

TLS 設定選項

為 API BaaS 設定 TLS 時,您可以選擇:

  • 在入口網站和負載平衡器上為堆疊節點設定 TLS

    在這種設定中,開發人員會使用 HTTPS 通訊協定存取入口網站,而瀏覽器中執行的入口網站會透過負載平衡器使用 HTTPS 向堆疊節點提出要求。負載平衡器會使用 HTTP 存取堆疊節點。
  • 在 Portal、負載平衡器和 Stack 節點上設定 TLS

    為強化安全性,請將負載平衡器設為使用 TLS 存取 Stack 節點。
  • 在 Portal 和單一 Stack 節點上設定 TLS

    在小型環境 (例如測試或開發環境) 中,您可能只有單一 Stack 節點,因此不需要納入負載平衡器。在這項設定中,請同時在入口網站和堆疊節點上設定 TLS。
  • 在 Portal 的負載平衡器上設定 TLS

    上方未提及的選項之一,是使用 Portal 節點前端的負載平衡器。在該設定中,您可以在負載平衡器上設定 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 Stack 會停用 TLS。接著,您可以使用堆疊節點的 IP 位址或 DNS 名稱和 8080 通訊埠,透過 HTTP 存取 BaaS API。例如:

http://stack_IP:8080

或者,您也可以設定 TLS 存取 BaaS API,以便透過以下方式存取:

https://stack_IP:8080

在本例中,您要將 TLS 存取權設為使用通訊埠 8080。不過,您不一定要使用 8080 通訊埠,也可以將 Stack 設定為使用其他通訊埠。唯一的要求是防火牆必須允許透過指定通訊埠的流量。

堆疊只能透過單一通訊埠支援一種要求類型 (HTTP 或 HTTPS)。因此,如果您在通訊埠 8080 設定 HTTPS 存取,您無法使用 HTTP 存取通訊埠 8080。如果您將堆疊設為透過 HTTPS 使用通訊埠 8443,堆疊將不再監聽通訊埠 8080。

請按照下列程序設定對堆疊的 TLS 存取權:

  1. 產生包含 TLS 認證和私密金鑰的 KeyStore JKS 檔案。詳情請參閱「為 Edge On Premises 設定 TLS/SSL」。
    注意:請確認 Keystore 和金鑰的密碼相同。
  2. 將 KeyStore 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
    # 根據預設,TLS 存取權會使用 8080 連接埠。
    # 使用這個屬性指定不同的通訊埠。
    # tomcat-server_port=8080


    警告密碼值必須以明文形式輸入。 因此,您應保護 usergrid.properties,避免遭到未經授權的存取。

    請使用 tomcat-server_keyalias 屬性指定 KeyStore 別名。金鑰別名是在建立金鑰時設定。舉例來說,您可以使用 -alias 選項搭配 keytool 指令來設定。

    使用 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 configuration
  6. 重新啟動 BaaS 堆疊:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart
  7. 使用 HTTPS 在堆疊節點上執行下列 cURL 指令,確認 TLS 是否運作:
    > curl -k https://localhost:8080/status -v

    如果 TLS 已正確設定,您應該會看到包含狀態資訊的回應。

    如果您已設定 TLS 存取權,但使用的是 8080 以外的通訊埠,請修改上述指令,以便使用正確的通訊埠。
  8. 對所有 Stack 節點重複上述步驟。
  9. 如果您在資料結構節點前端有負載平衡器,請設定負載平衡器,以便透過 HTTPS 向資料結構節點提出要求。詳情請參閱負載平衡器的說明文件。

    如果入口網站直接向資料堆疊提出要求,請按照下一個章節所述,將入口網站設為透過 HTTPS 存取資料堆疊。
  10. 請按照「在堆疊或入口網站上為 TLS 設定 API BaaS 堆疊節點」一節所述的程序操作,確保堆疊節點在產生使用者回應時,能使用正確的 TLS 網址。

設定入口網站,透過 TLS 存取 Stack

在瀏覽器中執行的 BaaS Portal 會向 BaaS Stack 發出 API 呼叫,如果您將 BaaS 堆疊設為使用傳輸層安全標準 (TLS),也必須將入口網站設為透過 HTTPS 發出這類呼叫。

API BaaS 安裝作業通常會設定為:

  • 在 Portal 和 Stack 節點之間使用負載平衡器

    設定負載平衡器,透過 HTTPS 向 Stack 節點提出要求。詳情請參閱負載平衡器的說明文件。

    在這種情況下,Portal 可以透過 HTTP 或 HTTPS 存取負載平衡器,具體取決於您如何設定負載平衡器。如果負載平衡器使用 TLS,請按照下列程序設定入口網站,以便向 HTTPS 負載平衡器提出要求。
  • 讓入口網站直接向資料庫堆疊提出要求

    如以下所述,設定入口網站透過 HTTPS 存取資料庫堆疊。

按照下列程序設定 API BaaS 入口網站,以便透過 HTTPS 發出 API 呼叫:

  1. 請按照上述說明,在 BaaS 堆疊上設定 TLS 存取權,或是按照負載平衡器說明文件,在堆疊節點的負載平衡器上設定 TLS 存取權。
  2. 編輯 /opt/apigee/customer/application/portal.properties 以設定下列屬性。如果該檔案不存在,請建立檔案:
    baas.portal.config.overrideUrl=https://stackIP:port

    請針對單一節點安裝作業,指定 API 堆疊節點的 IP 位址或 DNS 名稱和通訊埠,或針對 API BaaS 堆疊節點前端的負載平衡器,指定負載平衡器的 IP 位址或 DNS 名稱和通訊埠。
  3. 設定 Portal 節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal configure
  4. 使用以下指令重新啟動 Portal:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart
  5. 如果您在設定上述堆疊的 TLS 存取權時使用自行簽署的憑證,瀏覽器可能不會允許從入口網站提出的堆疊要求。如果瀏覽器顯示錯誤訊息,指出系統不允許 HTTPS 存取 Stack,請在瀏覽器中要求下列網址,並新增安全性例外狀況以允許存取:
    https://stackIP:port/status

    指定 API 堆疊節點或負載平衡器的 IP 位址,或是 DNS 名稱和通訊埠。

在 API BaaS 入口網站上設定 TLS

根據預設,使用者會透過 Portal 伺服器的 9000 連接埠,提出未加密的 HTTP 要求來存取 Portal。您可以將入口網站設為使用 HTTPS,藉此加密從入口網站傳送至入口網站的資料。

根據預設,您可以使用入口網站節點的 IP 位址或 DNS 名稱和通訊埠 9000,透過 HTTP 存取入口網站。例如:

http://portal_IP:9000

或者,您也可以設定入口網站的 TLS 存取權,以便透過下列表單存取:

https://portal_IP:9443

在本例中,您要將 TLS 存取權設為使用通訊埠 9443。不過,通訊埠 9443 並非必要,您可以將入口網站設為使用其他通訊埠。

Portal 只能透過單一通訊埠支援一種要求類型 (HTTP 或 HTTPS)。因此,如果您在通訊埠 9000 上設定 HTTPS 存取權,就無法使用 HTTP 存取通訊埠 9000。如果您將入口網站設為使用 HTTPS 的 9443 通訊埠,則入口網站將不再監聽 9000 通訊埠。

如要為 Portal 設定 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
    # 根據預設,TLS 存取權會使用通訊埠 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. 設定 Portal 節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal configure
  6. 重新啟動 Portal:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart
  7. 請按照「在堆疊或入口網站中設定 TLS 適用的 API BaaS 堆疊節點」一節所述的程序操作,確保堆疊節點擁有適用於入口網站的 TLS 網址。

在 Stack 或 Portal 上為 TLS 設定 API BaaS 節點

如果您在 Stack 或 Portal 節點前面加入負載平衡器,或是直接在 Portal 或 Stack 節點啟用 TLS,就必須設定節點的正確網址,才能存取 Stack 和 Portal。例如,堆疊節點在下列情況中需要這項資訊:

  • 在 BaaS API 要求的回應中加入網址。
  • 在重設密碼或傳送其他通知時,在電子郵件範本中加入連結。
  • 將使用者重新導向至特定入口網站頁面。

如果在堆疊節點前方使用負載平衡器,或是在堆疊節點上設定 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 替換為資料夾的負載平衡器網址。

如果您在入口網站節點前方使用負載平衡器,或是在堆疊節點上設定 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 configuration
  2. 重新啟動 BaaS 堆疊:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart
  3. 如果您修改了 portal.properties,請設定 Portal 節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal configure
  4. 重新啟動 BaaS Portal:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart