3

我有一个简单的服务器程序,从开放无线网络上的众多硬件设备中收集数据。我想确保连接到我端口的任何人都无法发送命令或监听我的流量,因此我需要服务器来验证客户端。我找到了一些示例,但大多数似乎都采用了从客户端验证服务器的方法。我是 SSL 和 Socket 编程的新手。

从我的客户那里

KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("KeyStore"), "password".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keystore);

SSLContext context = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();

context.init(null, trustManagers, null);

SSLSocketFactory sf = context.getSocketFactory();
return (SSLSocket) sf.createSocket(host, port);

在我拥有的服务器上

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(newFileInputStream("server"),"password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "password".toCharArray());
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
server = (SSLServerSocket) ssf.createServerSocket(this.port);

我不确定一切都在做什么,但从示例中我发现它是双向身份验证,所以有些矫枉过正。我想我只需要其中一段代码,但对 SSL 的理解不够好,无法知道是哪一段。哪一方需要密钥库?谁需要密钥和证书?谢谢

4

1 回答 1

3

如果您只想将客户端身份验证添加到现有服务器身份验证中,请在服务器代码末尾添加以下行:

server.setNeedClientAuth(true);

如果您只希望服务器授权客户端而不是相反,请调用server.setUseClientMode(true)服务器,并setUseClientMode(false)在返回之前在客户端上创建 SSLSocket。请注意,此选项意味着客户端设备可能正在连接到其他人的服务器,并且无法知道它。

在任何一种情况下,服务器都需要一个信任库——它可以与它的密钥库相同——安装了客户端提供的证书的副本。客户端将需要提供此证书的密钥对。

于 2014-04-01T01:34:48.670 回答