我正在尝试使用以下基本条件构建客户机/服务器servlet应用程序:
客户端和服务器都是jetty嵌入式的;
服务器公开一个servlet,以便通过 POST
;
连接必须通过ssl进行保护(即通过https通过互联网进行连接);
我希望只有我的jetty客户端能够发送数据到我的服务器,所有其他暂定必须由服务器拒绝;
服务器和客户端都是无人值守的机器(即不能通过命令行插入密码);
客户端设备上不能存储明文密码。一般来说,我不希望有人可以打开远程客户端设备,窃取密码,并建立一个假远程设备能够发送数据到我的服务器了。
我已经通过 HTTP
但我对安全性感到困惑。我读到有可能使用客户机/服务器相互身份验证,似乎我正在寻找,但我不能得到完整的图片。在本文档中,客户机证书身份验证对如何构建共享的受信任ca有着或多或少的明确解释,但是访问 TrustStore
以及 KeyStore
在代码中是明确的。我想我在拼图中少了一块瓷砖。有人能给我指出正确的方向吗?
谢谢,
s。
1条答案
按热度按时间zfycwa2u1#
我(暂时)会给出一个简单的答案。
如果您只想让您的客户机与服务器通信,那么是的,客户机ssl/tls证书就是一个不错的选择。
你需要服务器的
SslContextFactory.Server.setNeedClientAuth(true)
设置为true。这将反过来导致java的javax.net.ssl.SSLParameters.setNeedClientAuth(true)
在建立传入连接时设置。如果客户端未能提供客户端证书,则连接将关闭,并且不会发送或处理任何http请求。至于保护客户端证书,这取决于您,您可以做任何您想做的事情,只要它产生一个有效的客户端
SslContextFactory.Client
jetty客户端可以访问的。这包括。。。使用明文密码
使用模糊密码(最省力,最安全)
在客户端其他位置加密的密钥库/信任库密码,在最后一分钟提供给sslcontextfactory.client(适度的安全性,不难理解)
创建
java.security.KeyStore
反对你自己并把它交给SslContextFactory.Client.setKeyStore(KeyStore)
以及SslContextFactory.Client.setTrustStore(KeyStore)
方法在启动jetty客户端之前(更好的安全性,为您提供更多的工作)您可能需要考虑从服务器动态刷新短期(24小时?)的客户机证书,并在遇到滥用时(在服务器/ca端)使客户机证书可被吊销(例如来自多个不同客户端IP的相同客户端证书)