我试图改进一些代码,使用数字证书登录我们的应用程序,可能是存储在PKCS11令牌上的证书。
它是Java客户端服务器应用程序,JBoss [Wildfly]上的服务器和丰富的Java胖客户端。我们还有一个基于GWT / Javascript的Web客户端,但这还不支持证书身份验证。
如果配置了证书身份验证,则当前实现使用双向SSL身份验证,即在打开连接时服务器将需要客户端证书。这会导致一些问题,并且在试图找到解决这些问题的方法时,我一直疯狂地搜索是否有一个标准的,正确的方法来对JBoss应用程序进行PKI认证'。
然而,我在这个主题上找到的所有内容似乎也围绕着使用双向SSL,这意味着 是正确的方法。
对我而言,这似乎是不受欢迎的,因为网络传输是一个非常低级别的问题,与应用程序逻辑以及身份验证和用户管理之类的东西大相径庭。
为了证明客户端是系统的有效用户(而不仅仅是具有服务器信任存储中的CA认可的凭据的人),服务器应用程序逻辑必须四处寻找找到的证书。用于传入连接以便从其中删除公共名称。我发现javax.servlet.request.X509Certificate
是一个可以在servlet上查询的标准参数,所以它至少应该是可能的。
这导致的另一个架构问题是我们的应用程序在某些敏感操作的生命周期内需要重新认证。如果一个人使用SSL连接来证明用户拥有私钥,那么逻辑上就需要打开一个完整的单独连接。
逻辑上,使用证书进行身份验证似乎需要
现在,这正是在SSL握手期间发生的事情,但显然其中包含了一大堆其他包袱与认证用户的应用程序级别无关。
我想过直接自己实现这些步骤,但这似乎违反了加密的第一条规则(不要实现自己的加密)。
如果服务器生成随机的nonce,那么会为进程引入一定程度的chattiness和stateful,这是可行的,但是当你努力争取无状态和可群集的服务器时会很痛苦。
基于时间的一次性密码实施绕过了这一点,似乎是双因素身份验证的标准化机制,正在获得Google+等的支持。
但是,我无法找到开箱即用的库中的任何东西,这些库可以让我直接使用强制PKI构建一个实现。