繁体   English   中英

Jetty 客户端/服务器相互认证

[英]Jetty client / server mutual authentication

我正在尝试使用这些一般要求构建客户端/服务器 servlet 应用程序:

  • 客户端和服务器都是嵌入式的;
  • 服务器公开一个 servlet,以便通过POST接收 json 数据;
  • 连接必须通过 SSL 进行保护(即连接将通过 https 通过 Inte.net 完成);
  • 我希望只有我的 Jetty 客户端能够向我的服务器发送数据,所有其他的尝试都必须被服务器拒绝;
  • 服务器和客户端是无人值守的机器(即不能通过命令行输入密码);
  • 没有明文密码必须存储在客户端设备上。 一般来说,我不希望有人可以打开远程客户端设备并窃取密码并构建一个能够将数据发送到我的服务器的假远程设备。

我已经通过HTTP构建了一个完美运行的客户端/服务器应用程序,但我对安全性感到困惑。 我已经读到有可能使用客户端/服务器相互身份验证,这似乎是我正在寻找的,但我无法获得完整的图片。 在本文档client-certificate-authentication中,或多或少清楚地解释了如何构建共享的可信 CA ,但是用于访问TrustStoreKeyStore的密码在代码中是明确的。 我想我错过了拼图中的一块瓷砖。 有人能指出我正确的方向吗?

谢谢,

S.

我将给出一个简单的答案(目前)。

如果您只想让您的客户端与服务器通信,那么是的,客户端 SSL/TLS 证书是通往 go 的途径。

您需要将服务器的SslContextFactory.Server.setNeedClientAuth(true)设置为 true。 这将反过来导致在传入连接建立时设置 Java 的javax.net.ssl.SSLParameters.setNeedClientAuth(true) 如果客户端未能提供客户端证书,则关闭连接,并且不会发送或处理任何 HTTP 请求。

至于保护客户端证书,这取决于您,您可以做任何您想做的事情,只要它产生 Jetty 客户端可以访问的有效客户端SslContextFactory.Client即可。 这包括...

  • 使用明文密码
  • 使用混淆密码(最少的努力,最低的安全性)
  • 在最后一分钟提供给 SslContextFactory.Client 的客户端其他地方的加密密钥库/信任库密码。 (适度的安全性,不难弄清楚)
  • 在启动 Jetty 客户端之前,自己创建java.security.KeyStore object 并将其交给SslContextFactory.Client.setKeyStore(KeyStore)SslContextFactory.Client.setTrustStore(KeyStore)方法。 (更好的安全明智,代表你做更多的工作)

您可能需要考虑让客户端证书短期(24 小时?)从服务器动态刷新,并在遇到滥用时让客户端证书可撤销(在服务器/CA 端)。 (例如来自多个不同客户端 IP 的相同客户端证书)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM