簡體   English   中英

使用NodeJS + express在Cloud Foundry應用程序中進行相互身份驗證

[英]Mutual Authentication in Cloud Foundry Application with NodeJS+express

我已經開發了部署為IBM Cloud中的Cloud Foundry應用程序NodeJs + express應用程序 我想執行相互身份驗證 (客戶端和服務器證書),以控制傳入流量和對我的應用程序的請求。 我的證書是由Secure Gateway生成的,如此處所述並將我的應用程序配置為雲目的地(可從本地客戶端訪問)。

安全網關已生成以下pem文件:服務器的主證書,中間證書和根證書以及目標證書和密鑰。 在文檔中,有一個使用tls.createServer的非常清晰的Node.js示例

在我的場景中,存在一些差異:首先,我處於相反的場景中(本地客戶端通過Secure Gateway創建隧道來連接到雲應用程序)。 其次,這是本文的主要原因,我的應用程序已部署為CF應用程序。

閱讀有關HTTP路由的 CF文檔時,我發現IBM雲僅使用端口80和443,然后通過HTTP將請求轉發到應用程序正在偵聽的端口(例如,如果我的NodeJ在端口6001上運行,並且我將其稱為雲端點)在端口443上,GoRouter將通過HTTP將請求轉發到正確的端口,並添加X-Forwarded-Proto標頭,以向應用程序傳遞用於請求的原始協議的信息。

考慮到這一點(假設這是正確的),在我的NodeJs代碼中,我無法使用https.createServer(opts, app)類的東西https.createServer(opts, app)因為所有https.createServer(opts, app) App容器的請求都將通過HTTP進行。

在這里閱讀CF文檔我知道可以告訴CF將證書轉發到我的應用程序,但是有些事情我無法真正理解。

首先,在負載均衡器或GoRouter處終止TLS有什么區別? 這種選擇背后的原因是什么?

我的第二個問題是,一旦將證書作為HTTP標頭轉發到我的應用程序,則處理證書的正確方法是什么? 這是因為我的NodeJs服務器將是http服務器,使用express以標准方式http.createServer(app)

感謝所有將幫助我解決此問題的人。 顯然,如果您有任何示例或建議,將非常有幫助。

閱讀有關HTTP路由的CF文檔時,我發現IBM雲僅使用端口80和443,然后通過HTTP將請求轉發到應用程序正在偵聽的端口(例如,如果我的NodeJ在端口6001上運行,並且我將其稱為雲端點)在端口443上,GoRouter將通過HTTP將請求轉發到正確的端口,並添加X-Forwarded-Proto標頭,以向應用程序傳遞用於請求的原始協議的信息。

考慮到這一點(假設這是正確的),在我的NodeJs代碼中,我無法使用https.createServer(opts,app)之類的東西,因為所有傳入App容器的請求都將通過HTTP進行。

那是對的。

首先,在負載均衡器或GoRouter處終止TLS有什么區別? 這種選擇背后的原因是什么?

僅在您正在運行自己的Cloud Foundry平台時適用。 如果您要將應用程序部署到由其他人運營的Cloud Foundry平台上,他們將做出此決定,並且不會以用戶身份影響您。

作為操作員,這是您需要做出的選擇。 根據您選擇的操作,需要權衡取舍。

  1. 您可以在LB處終止。 通常這是最快的,因為LB在處理TLS / SSL方面非常有效。 然后,LB可以將流量未經加密地轉發到Gorouter上,這減少了Gorouter的工作量,但代價是不加密兩者之間的流量(根據安全要求,可能不行)。 在這種情況下,LB有責任添加x-forwarded-*標頭。

    瀏覽器-> HTTPS-> LB-> HTTP-> Gorouters-> HTTP->您的應用

  2. 您可以使用第4層LB,並使Gorouters之間的連接平衡。 這使Gorouters可以終止TLS / SSL。 他們在執行此操作方面非常有效,但比大多數LB效率要低。 這也可以使您在請求路徑中加密直至Gorouter。 在這種情況下,Gorouters有責任添加x-forwarded-*標頭。

    瀏覽器-> HTTPS-> LB-> HTTPS-> Gorouters-> HTTP->您的應用

  3. 您可以在LB處終止,但可以在LB和Gorouters之間打開新的TLS / SSL會話。 這是效率最低的選項,因為它需要終止兩個TLS / SSL會話,但是它提供了到Gorouter的請求路徑中的加密。 在非第4層LB上,它也往往是最靈活的,它可以讓您的LB檢查HTTP流量,因為您要終止LB上的會話。 在這種情況下,LB有責任添加x-forwarded-*標頭。

    瀏覽器-> HTTPS(會話A)-> LB-> HTTPS(會話B)-> Gorouters-> HTTP->您的應用

同樣,如果您沒有運行Cloud Foundry平台,則可以忽略這一點。

我的第二個問題是,一旦將證書作為HTTP標頭轉發到我的應用程序,則處理證書的正確方法是什么? 這是由於以下事實:我的NodeJs服務器將是http服務器,使用標准方式http.createServer(app)用express創建。

您無需在創建服務器的方式上做任何花哨的事情。 您需要做的就是查看x-forwarded-*標頭,並使用它們進行決策。

  1. 請求是否通過HTTPS傳入? 查看x-forwarded-proto (對於HTTPS請求應設置為httpsx-forwarded-port (對於HTTPS請求應設置為443

  2. 請求中是否提供了客戶證書? 查看X-Forwarded-Client-Cert 如果包含證書,則客戶端提供了證書。

  3. 客戶的證書有效嗎? 如果您的應用收到請求,則客戶端的證書有效。 您知道這一點是因為平台可以為您處理該部分。 由於平台(LB或Gorouter)正在終止TLS / SSL連接,因此有責任驗證證書。 如果您的應用收到請求並且設置了x-forwarded-client-cert ,則該證書有效。

  4. 如何根據客戶證書做出授權決定? 這有點棘手,但是通常您會將證書從x-forwarded-client-cert cert中取出,讀取/解析它,然后根據證書內容做出決定(由於平台,我們知道這是有效的)。 您很可能會查看主題名稱,並將其視為用戶名。 然后查找該用戶的角色或權限。 但是,如何處理取決於您作為開發人員的情況。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM