Jetty 客户端/服务器相互认证
Jetty client / server mutual authentication
我正在尝试构建具有这些一般要求的客户端/服务器 servlet 应用程序:
- 客户端和服务器都是嵌入式jetty;
- 服务器公开了一个 servlet,以便通过
POST
; 接收 json 数据
- 必须通过 SSL 保护连接(即连接将通过互联网通过 https 完成);
- 我希望只有我的 Jetty 客户端能够向我的服务器发送数据,所有其他尝试都必须被服务器拒绝;
- 服务器和客户端都是无人值守的机器(即不是通过命令行输入的密码可以由人输入);
- 没有明文密码必须存储在客户端设备上。一般来说,我不希望有人可以打开远程客户端设备并窃取密码并构建一个能够将数据发送到我的服务器的假远程设备。
我已经通过 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的同一个客户端证书)
我正在尝试构建具有这些一般要求的客户端/服务器 servlet 应用程序:
- 客户端和服务器都是嵌入式jetty;
- 服务器公开了一个 servlet,以便通过
POST
; 接收 json 数据
- 必须通过 SSL 保护连接(即连接将通过互联网通过 https 完成);
- 我希望只有我的 Jetty 客户端能够向我的服务器发送数据,所有其他尝试都必须被服务器拒绝;
- 服务器和客户端都是无人值守的机器(即不是通过命令行输入的密码可以由人输入);
- 没有明文密码必须存储在客户端设备上。一般来说,我不希望有人可以打开远程客户端设备并窃取密码并构建一个能够将数据发送到我的服务器的假远程设备。
我已经通过 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的同一个客户端证书)