我有一个服务器(java)和一个客户端(android -smartphone)。 我希望客户端将加密数据(GPS位置,通过SSL)发送到服务器。 我想成为唯一能够连接到我的服务器的人。
为此,我创建了:
serverKeyStore.jks (containing servers private key)
clientKeyStore.jks (containing clients private key)
serverTrustStore.jks (containing clients certificate exported from clientKeyStore)
clientTrustStore.jks (-||- from serverKeyStore)
这样服务器信任客户端,客户端信任服务器。 (从证书的角度来看)没有其他人可以连接到我的服务器,因为服务器不会信任未知客户端并将终止连接。
为此我设置了服务器(仅与SSL相关的部分):
System.setProperty("javax.net.ssl.keyStore", "C:\\serverKeyStore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", pw);
System.setProperty("javax.net.ssl.trustStore", "C:\\serverTrustStore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", pw);
ServerSocketFactory gpsServerSocketFactory = SSLServerSocketFactory.getDefault();
gpsServerSocket = gpsServerSocketFactory.createServerSocket(gpsSocketPort);
while(true)
{
Socket newConnection = gpsServerSocket.accept();
new NewGPSConnectionThread(newConnection).start();
}
希望这已足够,SSLContext现在使用serverKeyStore.jks
和serverTrustStore.jks
通过System-Properties
设置。
客户端是我奋斗的地方:
我将clientKeyStore.jks
和clientTrustStore.jks
添加到assets-folder。我知道我不能直接引用assets文件夹中的文件,因为应用程序将被压缩。 (APK)
但我无法弄清楚如何在客户端配置SSLSocket以使用能够建立安全连接的clientKeyStore.jks
和clientTrustStore.jks
。
我的客户端程序的ssl相关部分:
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
gpsSocket = sslSocketFactory.createSocket(MainActivity.dstName, MainActivity.dstPortGPS);
但很明显SSLContext或SSLSocket不知道我的clientKeyStore.jks
和clientTrustStore.jks
,也不会引用默认值。
问题:
1)我的服务器ssl配置完成了吗?
2)如何完成客户端ssl配置?如何将client-key- and truststore
带入游戏?