Java SSLSockets 是否需要提供的 SSL 证书?

Do Java SSLSockets require a supplied SSL Certificate?

在 HTTPS 技术中,安全连接需要 SSL 证书。此证书必须通过自行生成或通过证书颁发机构 (CA) 获取。

在 Java 中,SSLSocketSSLSocket 的连接承诺与 HTTPS 连接具有相同的安全性(无中间人、加密等)。

当连接两个 SSLSocket 在两个单独的独立 Java 程序(一个客户端,一个服务器)中实例化时,是否有必要提供 Java(服务器)有有效证书吗?

指定使用哪个证书的方法有哪些?文档似乎对此没有任何说明。

我这里说的是纯粹的 Java。我不是在谈论使用 Java 通过 HTTPS 连接到 Web 服务。

这些套接字的目的是将用户名和密码从一个 Java 应用程序(客户端)发送到另一个应用程序(服务器)以进行身份​​验证,因此它们必须像可能。

如果您想进行安全加密,您需要有一个只有双方都知道的预共享密钥,或者您必须进行某种密钥交换来计算加密密钥。密钥交换需要正确的识别,否则 man-in-the-middle attack 是可能的,你将不再有安全的端到端加密。

要使用预共享密钥,请注意 TLS-PSK。在谷歌上搜索它时,看起来 Android 实现有一些命中,但主要是人们询问是否可能。使用替代的 SSL 实现 BouncyCastle 可以做到这一点。

如果不使用 PSK,您可以尝试使用匿名密码 (ADH)。我不知道 Java 是否支持它们,但无论如何您仍然需要某种身份证明以确保您正在与预期的服务器通话。

当然还有证书。如果您不想为您的应用程序使用 public 证书,您可以将自签名证书与 public key pinning 一起使用。

In HTTPS technology, an SSL certificate is required for a secure connection. This certificate must be acquired through self-generation, or through a certificate authority (CA). In Java, an SSLSocket to SSLSocket connection promises the same security as an HTTPS connection (No man-in-the-middle, encryption, etc).

否:HTTPS = 通过 SSL 套接字的 HTTP 流量。

When connecting two SSLSockets instantiated in two separate, stand-alone Java programs (One client, one server), is it necessary to supply Java (The server) with a valid certificate? Yes - Certificate and private key. If you want two way SSL, client would also need its own set of key/cert

What are the methods used to specify which certificate to use? The documentation doesn't seem to have anything to say about this.

要涵盖的内容很多。我不确定您已经知道多少,您需要阅读的内容包括 keytool、KeyStore、SSLContext、SSLServerSocketFactory、KeyManager。

或者您可以直接转到 this

等示例

When connecting two SSLSockets instantiated in two separate, stand-alone Java programs (One client, one server), is it necessary to supply Java (The server) with a valid certificate?

在正常使用中,服务器(以 SSLServerSocket 结尾)需要一个被对等方信任的证书。

如果服务器配置为需要证书,则客户端只需要证书,这不是默认设置。

What are the methods used to specify which certificate to use? The documentation doesn't seem to have anything to say about this.

参见JSSE Reference Guide。您可以通过系统属性执行此操作。您也可以编写一英尺左右的代码,但这不是必需的。