在使用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