2013-01-23 86 views
5

我有一個需要從客戶端安全(https)連接的node.js基於Web的應用程序。我想要的是,在某些路徑上,客戶端證書身份驗證是必需的,而不是其他路徑。Node.js的客戶端證書身份驗證僅

舉例來說。如果用戶去https://www.example.com/main服務器不需要客戶端證書認證(並因此瀏覽器不會問任何東西)。但是,如果用戶導航到https://www.example.com/secure,那麼客戶端證書認證將是必需的(並且因此瀏覽器將彈出用於選擇使用哪個證書的對話框)。

我怎樣才能做到這一點。我能夠強制客戶端證書認證,如果我通過requestCert:truerejectUnauthorized:truehttps.createServer選項。這種方法的問題是每個路徑都需要客戶端證書。

+0

客戶端證書是SSL握手的一部分;我不確定你可以做你想做的。 – Joe

+0

@Joe:這就是我所害怕的。但我見過這樣做的網站。首先,這些應用程序會顯示一個頁面,要求用戶插入智能卡(客戶端證書所在的位置)。當您按「確定」時,應用程序會將用戶重定向到需要客戶端證書的相同應用程序中的另一個路徑。此時瀏覽器會顯示一個對話框供用戶選擇使用的證書。那麼,也許有辦法以某種方式在同一連接中強制進行新的握手? – Jukka

+0

我有辦法解決這個問題,但我不想使用它。一種解決方案是在同一個應用程序中使用兩個不同的監聽器(不同的端口)。另一個需要客戶端證書認證,另一個不需要。這種方法的問題是,我必須爲第二個端口使用非標準端口。這會導致某些客戶需要重新配置其防火牆以允許連接到該端口。 – Jukka

回答

0

我不知道如果我恰好知道你想要什麼。但根據我的理解,如果你使用的是快遞,你可以通過一個簡單的中間件管理這件事情。在該中間件可以跟蹤任何要求通過該

HTTPS連接從http或https未來已req.connection.encrypted(用約SSL連接信息的對象)。 HTTP連接沒有req.connection.encrypted。

而且(從文檔):

隨着HTTPS支持,使用request.connection.verifyPeer()和request.connection.getPeerCertificate()來獲得客戶端的認證信息。

我希望這有助於..

+1

我正在使用Express框架與我的應用程序。所有連接都已經是https。我想要的是某些路徑需要客戶端使用證書和其他路徑進行身份驗證。我正在使用節點0.8.18,它似乎沒有verifyPeer方法連接。 getPeerCertificate方法存在,它按照假定的方式工作(但它不強制客戶端證書驗證)。 – Jukka

1

我降落在這裏,因爲我就同一問題工作,將分享我採用的方法。對於需要用戶使用有效證書進行身份驗證的端點,我使用附加到需要證書的端點的自定義路徑,並驗證用戶是否使用證書進行身份驗證(如果他們正在訪問遵循該路徑的任何端點)。即:

app.use('/api/cert', function(req, res, next){ 
    //validate that any token passed in the request was generated for a valid 
    //cert login, otherwise reject request 

    //pseudo-code 
    if(isValidCertToken(req.authentication.token)) { 
     next(); //this will pass it on to the correct endpoint in the /api/cert/[whatever] chain 
    } else { 
     req.status(401).send({error: 'invalid login, cert required'}); 
    } 
}); 

這將要求您允許用戶通過設置requestCert標誌設置爲true使用證書進行身份驗證的能力,同時也將允許其他身份驗證方法,如果用戶不希望使用所需的「證書「只要在設置https連接時將rejectUnauthorized設置爲false即可。

+0

這仍然意味着提示用戶使用哪個證書來選擇每個路徑 – DavidM

+0

是的不幸的是。我們通過將使用OAuth 2.0的獨立SSO服務器重定向到進行身份驗證來避免這種情況。 流程: 應用程序 - > [用戶點擊登錄] - >直接到OAuth 2.0服務器 - > [用戶提示爲證書] - > [用戶驗證基於證書] - >重定向到應用程序與代碼請求令牌 或 應用程序 - > [用戶點擊登錄] - >直接到OAuth 2.0服務器 - > [用戶提示輸入證書] - > [用戶選擇取消無證書] - >顯示登錄屏幕 - > [用戶使用UN/PW驗證] - >使用代碼重定向到應用程序以請求令牌 – weagle08

相關問題