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 存取權:
- 產生包含 TLS 認證和私密金鑰的 KeyStore JKS 檔案。詳情請參閱「為 Edge On Premises 設定 TLS/SSL」。
注意:請確認 Keystore 和金鑰的密碼相同。 - 將 KeyStore JKS 檔案複製到 Stack 節點的目錄,例如 /opt/apigee/customer/application。 必須允許「 Apigee」使用者存取該目錄。
- 將 JKS 檔案的擁有權變更為「apigee」使用者:
> chown apigee:apigee /opt/apigee/customer/application/keystore.jks
其中 keystore.jks 是金鑰庫檔案的名稱。 - 編輯 /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。 - 設定 Stack 節點:
> /opt/apigee/apigee-service/bin/apigee-service baas-usergrid configuration - 重新啟動 BaaS 堆疊:
> /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart - 使用 HTTPS 在堆疊節點上執行下列 cURL 指令,確認 TLS 是否運作:
> curl -k https://localhost:8080/status -v
如果 TLS 已正確設定,您應該會看到包含狀態資訊的回應。
如果您已設定 TLS 存取權,但使用的是 8080 以外的通訊埠,請修改上述指令,以便使用正確的通訊埠。 - 對所有 Stack 節點重複上述步驟。
- 如果您在資料結構節點前端有負載平衡器,請設定負載平衡器,以便透過 HTTPS 向資料結構節點提出要求。詳情請參閱負載平衡器的說明文件。
如果入口網站直接向資料堆疊提出要求,請按照下一個章節所述,將入口網站設為透過 HTTPS 存取資料堆疊。 - 請按照「在堆疊或入口網站上為 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 呼叫:
- 請按照上述說明,在 BaaS 堆疊上設定 TLS 存取權,或是按照負載平衡器說明文件,在堆疊節點的負載平衡器上設定 TLS 存取權。
- 編輯 /opt/apigee/customer/application/portal.properties 以設定下列屬性。如果該檔案不存在,請建立檔案:
baas.portal.config.overrideUrl=https://stackIP:port
請針對單一節點安裝作業,指定 API 堆疊節點的 IP 位址或 DNS 名稱和通訊埠,或針對 API BaaS 堆疊節點前端的負載平衡器,指定負載平衡器的 IP 位址或 DNS 名稱和通訊埠。 - 設定 Portal 節點:
> /opt/apigee/apigee-service/bin/apigee-service baas-portal configure - 使用以下指令重新啟動 Portal:
> /opt/apigee/apigee-service/bin/apigee-service baas-portal restart - 如果您在設定上述堆疊的 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,請按照下列步驟操作:
- 建立 PEM 格式的金鑰檔案和憑證檔案。
注意:請確認金鑰或憑證上沒有密碼/密碼短句。 - 將 PEM 檔案複製到入口網站節點的目錄,例如 /opt/apigee/customer/application。目錄必須可供「apigee」使用者存取。
- 將 PEM 檔案的擁有權變更為「apigee」使用者:
> chown apigee:apigee /opt/apigee/customer/application/*.PEM - 編輯 /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。 - 設定 Portal 節點:
> /opt/apigee/apigee-service/bin/apigee-service baas-portal configure - 重新啟動 Portal:
> /opt/apigee/apigee-service/bin/apigee-service baas-portal restart - 請按照「在堆疊或入口網站中設定 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 後:
- 設定 Stack 節點:
> /opt/apigee/apigee-service/bin/apigee-service baas-usergrid configuration - 重新啟動 BaaS 堆疊:
> /opt/apigee/apigee-service/bin/apigee-service baas-usergrid restart - 如果您修改了 portal.properties,請設定 Portal 節點:
> /opt/apigee/apigee-service/bin/apigee-service baas-portal configure - 重新啟動 BaaS Portal:
> /opt/apigee/apigee-service/bin/apigee-service baas-portal restart