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

私有雲 v4.18.01 的邊緣

傳輸層安全標準 (TLS) 是標準安全性技術,用來確保 API 環境中的加密訊息安全無虞,而且安全無虞。您可以在 API BaaS 入口網站和 API 的 BaaS 堆疊節點上設定 TLS。

下圖顯示 API BaaS 的一般部署圖表,其中包含一個 BaaS 入口網站節點和三個 API BaaS 堆疊節點。

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

這項部署作業會在入口網站和 Stack 節點之間建立負載平衡器。在這項設定中,入口網站會向負載平衡器發出 HTTP 要求,負載平衡器則會將要求轉送至其中一個 Stack 節點。這是實際工作環境系統的建議部署環境。

TLS 設定選項

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

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

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

    為了提升安全性,請將負載平衡器設為使用 TLS 存取 Stack 節點。
  • 在入口網站和單一堆疊節點上設定 TLS

    在測試或開發環境等小型環境中,您可能僅適用一個堆疊節點,也就是說不需要包含負載平衡器。採用這項設定時,請在入口網站和堆疊節點上設定 TLS。
  • 在入口網站的負載平衡器上設定 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 堆疊會停用 TLS。接著,您可以使用 Stack 節點和通訊埠 8080 的 IP 位址或 DNS 名稱,透過 HTTP 存取 BaaS API。例如:

http://stack_IP:8080

或者,您可以設定 BaaS API 的傳輸層安全標準 (TLS) 存取權,以便透過下列格式存取:

https://stack_IP:8080

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

Stack 必須透過單一通訊埠才能支援一種類型的要求 (HTTP 或 HTTPS)。因此,如果您在通訊埠 8080 上設定 HTTPS 存取權,就無法使用 HTTP 存取通訊埠 8080。如果將 Stack 設定為搭配 HTTPS 使用通訊埠 8443,Stack 就不會再監聽通訊埠 8080。

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

  1. 產生含有傳輸層安全標準 (TLS) 憑證和私密金鑰的 KeyStore JKS 檔案。詳情請參閱為 Edge On Premise 設定 TLS/SSL
    注意:請確定 KeyStore 和金鑰的密碼相同。
  2. 將 KeyStore JKS 檔案複製到堆疊節點上的目錄,例如 /opt/apigee/customer/application。「apigee」使用者必須能存取這個目錄。
  3. 將 JKS 檔案的擁有權變更為「apigee」使用者:
    > chown apigee:apigee /opt/apigee/customer/application/keystore.jks

    其中 keystore.jks 是 KeyStore 檔案的名稱。
  4. 編輯 /opt/apigee/customer/application/usergrid.properties 檔案來設定下列屬性,包括 JKS 檔案的路徑,以及 KeyStore 和金鑰上的密碼。如果該檔案不存在,請建立該檔案:
    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_port=8080


    警告password 的值必須為明文。 因此,建議您保護 usergrid.properties,防止未經授權的存取行為。

    使用 tomcat-server_keyalias 屬性來指定 KeyStore 別名。您在建立金鑰時就已設定金鑰別名。舉例來說,您可以使用 keytool 指令的 -alias 選項來設定這個值。

    使用 tomcat-server_ssl.protocols 設定 Stack 支援的 TLS 通訊協定。如需 Java 8 支援的通訊協定清單,請參閱 http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#jssename
  5. 設定堆疊節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid 設定
  6. 重新啟動 BaaS 堆疊:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart
  7. 請在 Stack 節點上執行下列 cURL 指令,確認 TLS 運作正常:
    > curl -k https://localhost:8080/status -v

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

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

    如果入口網站直接提出要求至 Stack,請將入口網站設為透過 HTTPS 存取堆疊 (如下一節所述)。
  10. 按照下方「在堆疊或入口網站上為傳輸層安全標準 (TLS) 設定 API BaaS 堆疊節點」一節所述的程序,確保 Stack 節點在產生使用者回應時具有正確的 TLS 網址。

設定入口網站以透過 TLS 存取堆疊

向 BaaS Stack 發出 API 呼叫,透過瀏覽器功能運作的 BaaS 入口網站。如果您將 BaaS Stack 設定為使用 TLS,也必須將入口網站設為透過 HTTPS 進行這些呼叫。

API BaaS 安裝一般設為下列其中一種方式:

  • 在入口網站和堆疊節點之間使用負載平衡器

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

    在這項設定中,入口網站可以透過 HTTP 或 HTTPS 存取負載平衡器,具體情況取決於您設定負載平衡器的方式。如果負載平衡器使用 TLS,請按照下方程序設定入口網站,向 HTTPS 負載平衡器發出要求。
  • 要求入口網站直接向 Stack 提出要求

    按照下方說明設定入口網站,以便透過 HTTPS 存取 Stack。

請按照下列程序設定 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 堆疊堆疊節點前方設有負載平衡器,則可指定負載平衡器的值。
  3. 設定入口網站節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal 設定
  4. 使用下列指令重新啟動入口網站:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart
  5. 如果您在為上述 Stack 設定 TLS 存取權時,使用的是自行簽署憑證,您的瀏覽器可能會不允許從入口網站傳送至 Stack 的要求。如果您在瀏覽器中看到不允許透過 HTTPS 存取 Stack 的錯誤,請在瀏覽器中要求以下網址,並新增允許存取的安全性例外狀況:
    https://stackIP:port/status

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

在 API BaaS 入口網站上設定 TLS

根據預設,使用者會透過入口網站伺服器上的通訊埠 9000 發出未加密 HTTP 要求,以便存取入口網站。您可以將入口網站設為使用 HTTPS,藉此加密從入口網站收發的資料。

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

http://portal_IP:9000

或者,您可以設定入口網站的 TLS 存取權,能夠以下列格式存取:

https://portal_IP:9443

在本範例中,您會將 TLS 存取權設定為使用通訊埠 9443。但不一定要通訊埠 9443。您可以將入口網站設為使用其他通訊埠。

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

如何為入口網站設定 TLS:

  1. 建立採用 PEM 格式的金鑰檔案和憑證檔案。
    注意:請確認金鑰或憑證中沒有任何密碼或通關密語。
  2. 將 PEM 檔案複製到入口網站節點的目錄,例如 /opt/apigee/customer/application。「apigee」使用者必須能存取這個目錄。
  3. 將 PEM 檔案的擁有權變更為「apigee」:
    > chown apigee: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使用 TLS.0.ssl0


    # 請使用這項屬性指定其他通訊埠。
    # 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. 設定入口網站節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal 設定
  6. 重新啟動入口網站:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart
  7. 按照下方「在堆疊或入口網站上為 TLS 設定 API BaaS 堆疊節點」一節的說明,確保 Stack 節點的入口網站使用正確的 TLS 網址。

在堆疊或入口網站上為傳輸層安全標準 (TLS) 設定 API BaaS 節點

如果您在堆疊或入口網站節點前方加入負載平衡器,或是直接在入口網站或堆疊節點上啟用 TLS,則必須為節點設定正確的網址,才能存取 Stack 和入口網站。舉例來說,在以下情況,堆疊節點需要這項資訊:

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

如果您在 Stack 節點前方使用負載平衡器,或是在 Stack 節點上設定 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),才需要包含通訊埠。

如果在堆疊節點前方使用負載平衡器,您也必須在 /opt/apigee/customer/application/portal.properties 設定下列屬性:

baas.portal.config.overrideUrl=http://localhost:8080

http://localhost:8080 替換為 Stack 負載平衡器的網址。

如果您在入口網站節點的前面使用負載平衡器,或是在 Stack 節點上設定 TLS,請在 usergrid.properties 中設定下列屬性:

usergrid-deployment_portal.url=http://localhost:9000

http://localhost:9000 替換為負載平衡器的網址。如果負載平衡器已設為使用 TLS,請使用 HTTPS 通訊協定。如果您使用的是非標準通訊埠 (亦即 HTTP 的通訊埠 80 和 HTTPS 的通訊埠 443),才需要包含通訊埠。

編輯 usergrid.properties 後:

  1. 設定堆疊節點:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid 設定
  2. 重新啟動 BaaS 堆疊:
    > /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart
  3. 如果您已修改 portal.properties,請設定入口網站節點:??
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal 設定
  4. 重新啟動 BaaS 入口網站:
    > /opt/apigee/apigee-service/bin/apigee-service baas-portal restart