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

Jetty client / server mutual authentication

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

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

谢谢,

S.

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

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

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

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

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

您可能需要考虑让客户端证书 short-lived(24 小时?)从服务器动态刷新,并且客户端证书是可撤销的(在 server/CA 端)如果您遭遇虐待。 (比如来自多个不同客户端IP的同一个客户端证书)