[英]How to simply generate SSL certificate and ServerSocket form Java code
有沒有簡單的方法來動態生成不受域限制的不受信任的ssl證書並將其應用於服務器套接字-全部來自代碼,沒有命令行或其他文件?
目的是兩個主機之間的安全連接,它們僅知道IP和端口之間可以相互通信-服務器啟動時隨機生成的證書用作“不可信”,沒有域,因此沒有驗證(如果我沒記錯的話)。 我認為這對於確保第三方應用程序中數據中心之間的數據傳輸安全很有用。
這是未加密的簡單客戶端服務器測試的工作代碼。
package study.benchmark.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.net.ServerSocketFactory;
import javax.net.SocketFactory;
import org.junit.Test;
public class DynamicSSLTest {
@Test
public void sslServerSocketTest() throws Exception {
System.out.println("ssl server test");
final int port = 8750;
// server
Thread th = new Thread() {
@Override
public void run() {
try {
//ServerSocketFactory factory = SSLServerSocketFactory.getDefault();
ServerSocketFactory factory = ServerSocketFactory.getDefault();
ServerSocket server = factory.createServerSocket(port);
Socket socket = server.accept();
OutputStream out = socket.getOutputStream();
out.write("some data".getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
};
th.start();
//client
//SocketFactory factory = SSLSocketFactory.getDefault();
SocketFactory factory = SocketFactory.getDefault();
Socket socket = factory.createSocket("localhost", port);
InputStream is = socket.getInputStream();
StringBuffer sb = new StringBuffer();
int data;
while ((data = is.read()) >= 0) {
System.out.print((char) data);
}
System.out.println();
socket.close();
th.join();
}
}
您可以使用諸如BouncyCastle之類的庫動態生成自簽名證書(本質上,對於要進行自簽名的證書,您可以使用與主題DN相同的頒發者DN,然后使用與證書的公鑰對應的私鑰進行簽名)。 然后,您需要將其放入KeyStore
(至少在內存中,不一定在文件中),並從中構建SSLContext
,以便能夠構建SSLSocketFactory
。
這對於測試很有用,但這不會使您的應用程序安全 。 一般來說,未經遠程方認證的加密是不安全的。 您可以根據需要與遠程方“秘密”交換信息,但是如果您尚未驗證其身份,則不能確定將機密信息提供給了預期的接收者。
如果您的證書是動態生成的,則在對服務器進行任何調用之前,您需要找到一種讓客戶端知道它確實是合法證書的方法。
通用的SSH方法(假設少數人實際上檢查了第一次連接中獲得的指紋-有些人實際上進行了帶外檢查)是一種折衷方案,客戶端傾向於在第一次時(或多或少地盲目地)接受密鑰。但是如果更改了,將會被警告。 您也可以實施這種方法來處理X.509證書信任,但是如果您每次重新啟動服務器時都重新生成一個新的自簽名證書,那么您將回到最初的問題。
您可以通過具有某種在線/動態CA來解決此問題,在該CA中,服務器將根據它們可以動態向CA證明的內容(以證明它們是您的服務器之一,也許基於雙方都知道的一些配置參數),然后讓客戶端信任該CA,但這是一個更復雜的方案。
為什么? 它不安全,反正誰會信任它呢? 為什么不能為每個部署脫機創建服務器證書?
出於保護兩個主機之間通信安全的既定目的,兩者都在您的控制之下,SSH是一個更好的解決方案。 您可以生成僅與其他計算機共享的密鑰對。 Google提供了“ java ssh”選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.