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证书和私钥证明,这更为典型。我怀疑服务器*可能会根据公钥查找凭证,但效率不高。