关于 Java 客户端和服务器之间的 SSL 连接的问题

Question about Java SSL connection between client and server

所以我想在 Java 中设置一个 SSL server/client,我的网络知识不是很好我在 [=21= 中创建了正常的 servers/clients ] 很多次,想启动它并设置 SSL,这样用户就不能只向我的客户端发送错误的数据包,认为是服务器发送它们。

我查阅了一些示例等,发现了这个 GitHub 存储库,它显示了一个在客户端和服务器之间使用 SSL 加密的基本服务器,并在我的 IDE 中进行了设置。 这是回购协议: https://github.com/AlphaGarden/SSL-Client-Server

我的问题是为什么客户端和服务器同时使用证书?用户不能只从客户端获取证书并使用它们来解密 SSL 吗?在客户端中还有 2 个字符串,password 和 password2 ... 我是否也应该对使用我的客户端的人隐藏这些字符串?如果不是,我是否应该向用户隐藏任何可以帮助他们解密 SSL 流量并向我的客户提供虚假信息的客户端?

只是解释 SSL/TLS 连接的一些基础知识:Wkipedia https://en.wikipedia.org/wiki/Transport_Layer_Security, for TLS 1.2 RFC5246: https://www.rfc-editor.org/rfc/rfc5246 and for TLS 1.3 RFC8446 https://www.rfc-editor.org/rfc/rfc8446.

安全连接的基本原则是在服务器端和客户端使用(每个)证书并交换它们。证书本身是无用的,因为它不能证明您就是您所说的那个人。要获得对证书的信任,通常的方法是从检查您身份的证书机构 (CA)“购买”证书。

今天的浏览器通常知道 CA 的根证书,因此可以检查服务器和客户端证书 通过浏览器(客户端)和服务器针对 CA 的根证书。

让我们看看简单的 SSL 服务器和客户端代码。我确定您注意到服务器和客户端正在使用 keystoretruststore 的“扭曲”来源,因此他们需要两个(不同的)密码才能访问这两个商店:

SSL 服务器:

String password = "abcdefg";
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("server/certificate-server.p12");
// TrustManagerFactory
String password2 = "aabbcc";
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX", "SunJSSE");
InputStream inputStream1 = ClassLoader.getSystemClassLoader().getResourceAsStream("client/certificate-client.p12");

SSLClient:

String password = "aabbcc";
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("client/certificate-client.p12");
// TrustManagerFactory ()
String password2 = "abcdefg";
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX", "SunJSSE");
InputStream inputStream1 = ClassLoader.getSystemClassLoader().getResourceAsStream("server/certificate-server.p12");

密钥库和信任库有什么用?密钥库保存(自己的)(服务器和客户端的)私钥,并且在信任库中保存(所有)受信任的证书(通常是 CA 根证书)。为了检查从另一方收到的证书,服务器和客户端证明证书链直到来自 CA 的根证书。

但这就是问题所在 - 由于程序使用的是自签名证书,所以在信任库中没有可用的“真实”和已保存的根证书。要使程序 运行 无需 用户交互(“你信任这个证书吗?”),两者都提供使用带有“已批准”证书的信任库,并且都是 运行宁.

对于您的第二个问题“用户不能只从客户端获取证书并使用它们来解密 SSL”,答案很简单:是。但是,当仅在“允许的”合作伙伴之间确保通信安全时 - 例如应该如何服务器知道客户端是真实的而不是攻击者?出于这个原因,客户端也发送了一个可以被服务器检查的证书 信任库。