在使用JSSE和TLS的Java中。我在服务器和客户端之间创建了一个安全套接字。在最终让套接字安全连接之后,我仍然对我现有的代码的安全性有一个基本的问题。我遵循教程中的说明,有时JavaDoc中的文档非常精确,但有点模糊,除非您使用Swaheli的术语方言......Java JSSE TLS - 此连接是否在双向安全加密?
我一直在使用C++进行网络编程很长一段时间。向Java的过渡很容易。然而,最近我发现审慎做出交通安全。这就是说:
我想创建一个安全的套接字,就像网页浏览器创建一个安全的套接字一样,所以双向的流量都是加密的。客户端可以看到他们从服务器发送的个人帐户信息(如果拦截的话非常糟糕),并且客户端可以安全地将他们的用户名和密码发送到服务器(如果截获也很糟糕)。
我完全知道公钥密码系统是如何工作的,但是公钥密码系统只有一个副作用。您将您的公钥发送到客户端,客户端使用公钥进行加密,并将数据发送到服务器,但服务器只能解密。现在据我所知,服务器使用私钥来加密发送到客户端的消息,并且需要添加另一层安全性以防止任何具有公钥的人都能够解密它。
- 我有一个公共/存储在文件中public.key和private.key私钥对(我使用JSSE的keytool实用
- 我包含在客户端public.key
- 我包括私人做这些。在服务器密钥
客户端类:
KeyStore keyStore;
TrustManagerFactory tmf;
KeyManagerFactory kmf;
SSLContext sslContext;
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextInt();
keyStore = KeyStore.getInstance("JKS");
keyStore.load(this.getClass().getClassLoader().getResourceAsStream("server.public"),"public".toCharArray());
tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keyStore);
kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, "public".toCharArray());
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
SSLSocketFactory sslsocketfactory = sslContext.getSocketFactory();
SSLSocket sslsocket = (SSLSocket)sslsocketfactory.createSocket("localhost", 9999);
服务器类:
String passphrase = "secret"
KeyStore keyStore;
TrustManagerFactory tmf;
KeyManagerFactory kmf;
SSLContext sslContext;
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextInt();
keyStore = KeyStore.getInstance("JKS");
keyStore.load(this.getClass().getClassLoader().getResourceAsStream("server.private"),passphrase.toCharArray());
tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keyStore);
kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, passphrase.toCharArray());
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
SSLServerSocketFactory sslserversocketfactory = sslContext.getServerSocketFactory();
SSLServerSocket sslserversocket =
(SSLServerSocket)sslserversocketfactory.createServerSocket(9999);
/* ** * ** *问题* ** * ** * */
一切正常!我将套接字连接到BufferedReader和BufferedWriter,并在accept()之后开始精美地来回交谈。从客户端连接并启动我的客户端和服务器发送/接收循环。
现在我知道在这一点上客户端到服务器的通信是安全的。只有服务器密钥才能解密来自客户端的流量。但是,服务器到客户端的通信呢?客户端密钥可以解密来自服务器的消息,但在Public Key Crypto 101中,您将了解到客户端现在应该向服务器发送公钥。这是在这个代码幕后发生的吗? SSLContext是否处理这个问题?或者现在我有一个从客户端到服务器的加密连接,我现在是否希望为客户端生成一个私钥/公钥对?
让我知道在上面的代码中发送和接收的流量是否真的在两个方向都是安全的。
你是如何“包括”在客户端和private.key服务器上public.key? – raghav