我有一個Web應用程序,任何人都可以註冊一個帳戶。我想使用客戶端證書進行身份驗證,而不是密碼。這是否實用?在公共Web應用程序中使用客戶端證書代替密碼
好像有很多的問題:
你如何產生一個跨瀏覽器的方式一個密鑰?
<keygen>
似乎很有用,但我需要支持Internet Explorer。你如何簽署密鑰對並獲得證書到瀏覽器中?客戶端證書的每一個解釋只包括用於生成證書的openssl命令。我真的不想從我的web應用程序中打開openssl。
由於服務器正在對證書進行簽名,因此如果其簽名(CA)密鑰受到威脅會怎麼樣?這似乎是比密碼數據庫泄漏更嚴重的攻擊,因爲攻擊者可以默默地冒充任何用戶。
我想避免簽署證書,只使用公鑰指紋作爲用戶的身份。這意味着CA密鑰的知識不能用來冒充任何人,因爲他們沒有用戶的私鑰。
看來以前有人應該做到這一切。整個端到端流程是否有開源的實現? Python或Django實現將特別有用。
這就是我認爲這個過程會是這樣的:
- 當用戶註冊後,瀏覽器生成一個密鑰對,併發送一個簽名請求到服務器。
- 服務器立即返回一個簽名證書,該證書被加載到瀏覽器中。服務器將密鑰指紋存儲在數據庫中以稍後對用戶進行身份驗證。我不想使用證書DN作爲身份驗證,請參閱上面有關CA妥協的內容。
- 前端Web服務器需要客戶端證書,驗證它們,並將公鑰指紋發送到我的應用服務器。
- 應用程序服務器通過其密鑰指紋查找用戶,現在進行身份驗證。
我不想處理證書吊銷。由於密鑰指紋用於認證,而不是證書DN數據,因此只需更改與用戶關聯的指紋即可強制使用該密鑰。
編輯:我能夠找到一個實現類似工作流程的演示:https://openweb.or.kr/html5/index_en.php。它在IE中不起作用,並且遇到了我提到的CA問題。
_「這是否實用?」 - 從用戶角度來看:並非如此;如果我想能夠從多個設備訪問您的網絡應用程序,我必須隨身攜帶我的證書。所以我可能會將它存儲到USB設備上,或者在網絡上的某個地方 - 這意味着它實際上已經被暴露了,而不是強大的,但_memorable_密碼會。 (所以除非你的用例是特定的,並且這種情況不太可能 - 我會說不,這是不是最明智的做法。) – CBroe
我忘了提及 - 這個應用程序只能用於單一設備,所以這是一個功能,不是證書不可移植的缺陷。 –
私鑰泄漏在任何使用它們的情況下都是一個問題。這個沒有什麼特別之處。這似乎並不重要,因爲您只使用您已經註冊的指紋,基本上等同於密碼。 – EJP