0

我打算在Java中爲桌面應用程序進行安全文件交換。 該應用程序需要一個可靠的身份驗證方法,必須保證只有授權用戶才能訪問系統。基於證書的身份驗證

在註冊過程中,用戶生成密鑰對,並將其用戶名和公鑰發送到系統的中央服務器。有權訪問此中央服務器的系統管理員會批准註冊,並要求證書頒發機構頒發將用戶名與公鑰證書綁定在一起的公鑰證書。生成一個x509證書並存儲在證書服務器上。

當用戶想要認證時,他輸入他的用戶名,應用程序用他的私鑰爲他創建一個數字簽名。該簽名被髮送到中央服務器,中央服務器向x509證書請求匹配的私鑰。如果在證書服務器上找到x509,它將爲中央服務器發送證書,並對用戶進行身份驗證。

我想我有正確的想法,但我不知道如何開始在Java中的實現。如果你覺得我有點困惑,你們能給我一些指點,或糾正我的想法嗎?

+0

您在詢問實施情況,因此我正在投票將其遷移至SO。 – Ayrx

+0

爲什麼要構建一個新的authn協議而不是使用TLS或SSH,兩者都可以執行cert authn?爲什麼不只是在服務器上存儲有效的authz'd證書,還是允許簽名證書和管理撤銷列表?你authn客戶端的關鍵服務器,但它似乎沒有別的...客戶端authn密鑰服務器如何?客戶端authn服務器如何?服務器服務器authn密鑰服務器如何?密鑰服務器authn服務器如何?你如何防止重放簽名?爲什麼需要中間服務器來存儲x509證書而不是存儲它? – atk

+0

這是一個大學項目,我認爲我們不應該使用TLS或SSH。無論如何,我明白你的觀點,我應該將授權證書存儲在中央服務器中。客戶端將能夠認證中央服務器,因爲該中央服務器也具有由相同CA頒發的證書。我應該使用的協議是站到站。 – wolvz

回答

2

在您的方案中,我沒有真正看到讓證書頒發機構簽署x509證書的要點。由於不需要信任鏈,因此感覺不必要的複雜。

相反,我會考慮使用諸如SSH密鑰之類的東西來進行身份驗證,就像git所做的一樣。

+0

在涉及兩個用戶的文件交換中,他們向中央服務器請求彼此的x509證書並交換籤名,以便他們確信他們正在與系統中的某個人進行通信(防止MITM)。這就是爲什麼我需要CA. – wolvz

1

我同意Terry Chia認證客戶端認證SSL會給你一個快速簡單的方法來獲得你想要的。使用SSL配置您的Web服務器,特別是客戶端身份驗證,並提供管理員用於簽署已批准證書的可信CA.

Java應用程序需要使用SSL庫,並有權設置庫的憑證。我認爲Java中的SSL默認庫可能會這樣做,並可能使用X509Certificate作爲指定憑證的方式。

在您的描述中,我覺得奇怪的是客戶端不會發送帶有私鑰證明的證書(無論您是簽署還是使用SSL,都有私鑰作爲簽名或SSL證明握手)。讓客戶說「這就是我是誰,這裏是證明」 - 即提供X509證書和私鑰證明,這更爲典型。我懷疑服務器*可能會根據公鑰查找憑證,但效率不高。