Java中的安全TCP连接

7
我想知道在Java中保护TCP连接的最佳方法。我希望只有经过身份验证的客户端才能与我的服务器通信,并在可能的情况下加密传输的数据。
我需要注意哪些问题并进行覆盖,可以使用哪些技术?
谢谢,
蒂姆。

您的客户端完全受您控制,还是部署在用户计算机上而不受您控制,而用户无需输入任何身份验证信息? - Paŭlo Ebermann
客户端将部署在用户的计算机上,一旦打开,它将建立到静态服务器的连接,从这里他们需要输入凭据进行身份验证,以便访问所提供的服务。 - Tim
那么我认为在程序中包含服务器证书/公钥和密码验证的情况下,SSL和SSH都可以使用。 - Paŭlo Ebermann
谢谢您的回答,我会查看一下并开始设计和实现。 - Tim
4个回答

3

Java提供了一种安全的套接字扩展,即JSSE,支持SSLv3和TLS协议。
它被设计为让你的代码与处理普通套接字类似。
你只需初始化SSLContext并配置它使用要使用的证书和各种参数,例如客户端认证、握手监听器等,其余部分将被透明地处理。
阅读本教程以开始学习。


2
通常的方式是使用 SSL,如前所述。这默认支持(强制)服务器身份验证和加密,客户端身份验证是可选的(例如,取决于配置 - 服务器可以确保客户端已经通过身份验证)。
在 Java 中,您可以使用 SSLSocket(和 SSLServerSocket)(或相应的工厂类),或者 SSLEngine(如果您想要进行非阻塞 IO)。或者一些使用此技术的更高级别的 API。
另一个选择是 SSH 协议。这允许建立加密和(通常)双向验证的连接,可以通过该连接路由多个通道。这通常用于远程命令执行或文件传输,但也允许端口转发。
在 Java 中,这可以通过 JSch(客户端)来实现。我不知道有任何服务器端的 Java 实现 - 但是您可以使用普通的 OpenSSH 服务器并将端口转发到您的 Java 服务器进程。

考虑到需要对客户端进行身份验证,因此在这种情况下,客户端身份验证将不是可选的。唯一可选的方式是如果在应用层面上进行了客户端身份验证,但如果已经是这种情况,那么问题就不会被问到。 - Nasko
@Nasko:我的意思是,它通常情况下对协议的工作来说是可选的 - 在这种使用情况下,当然会使其成为必须的。 - Paŭlo Ebermann

0

SSL得到了很好的支持(毕竟它被用于HTTPS)。基于公钥基础设施,它提供了各种加密和身份验证方案。


0

你需要问问自己你要保护什么。如果你只允许真正的客户端,你需要定义如何确定这一点。如果你允许完全的纯文本流量,这是不安全的,因为任何中间人都可以修改流量。至少你需要对你交换的数据进行完整性保护。

我同意大多数人认为 SSL 可能是最简单的方法来实现这个目标。你需要使用客户端证书来允许验证连接的客户端。你有两种方法来使用客户端证书:

  • 为每个客户端创建自签名证书,然后保留证书哈希 -> 客户端映射的数据库,并在验证客户端证书时查询数据库
  • 或者创建自己的根 CA 证书并为每个客户端颁发证书,然后在进行客户端证书验证时需要验证客户端证书是否正确链接到您的根 CA 证书

采取哪种方法完全取决于你,而且同样安全。选择最适合当前项目的设计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接