【问题标题】:Jetty client / server mutual authenticationJetty客户端/服务器相互认证
【发布时间】:2020-08-20 16:16:24
【问题描述】:

我正在尝试构建具有以下一般要求的客户端/服务器 servlet 应用程序:

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

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

谢谢,

S.

【问题讨论】:

  • 你在这里问了很多问题。如何确保只有我的客户端可以交谈,如何做 SSL/TLS 客户端证书,如何保护客户端证书详细信息等。这需要一段时间才能回答。

标签: java ssl jetty keystore truststore


【解决方案1】:

我将给出一个简单的答案(暂时)。

如果您只想让您的客户端与服务器通信,那么可以,客户端 SSL/TLS 证书是您的最佳选择。

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

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

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

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

【讨论】:

  • 感谢您的详细回复,我会仔细研究的。我正在阅读有关 KeyStore 的信息,但令我感到困惑的是,为了打开 Keystore,我必须向 Jetty 提供一个密码,我必须在文件系统的某个地方(无论是否混淆)写入密码(如果我错了,请纠正我)。据我所知,KeyStore 是安全的,但如果有人从文件系统中窃取了密码,则可以获取其中的安全信息并冒充假客户端。还是不行?
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 2021-08-07
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2014-10-06
相关资源
最近更新 更多