我有一个简单的服务器程序,从开放无线网络上的众多硬件设备中收集数据。我想确保连接到我端口的任何人都无法发送命令或监听我的流量,因此我需要服务器来验证客户端。我找到了一些示例,但大多数似乎都采用了从客户端验证服务器的方法。我是 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 的理解不够好,无法知道是哪一段。哪一方需要密钥库?谁需要密钥和证书?谢谢