SSL Tunnel implementation on Java(1)

Tagged as
January 20th, 2006 | by mk |

SSL Tunnel 有甚麼用處我不解釋了,有空便到 google 找找看吧。簡單一點說,那是一套反生產軟件,所以千萬不要在老闆前使用。

拿 Java 寫 SSL Tunnel 軟件其實是很方便的,因為 J2SE 上要用的程式庫一概齊全,所以也不用周圍找 library。要準備的工具如下:

  • Java IDE + Java SDK (推薦 Eclipse)
  • Portecle (認證產生軟件)
  • 兩台電腦,其中一台要對外開放 port 443
  • 一台支援 SSL 的代理伺服器

原理:
SSL 是加密了的資料,對不是在連線兩端的機器來說,只是一堆無意義的 binary data。而代理伺服器由於不清楚資料的內容,不會儲存資料。有人就想到如果可以拿來傳送封包,那麼… 好了,說正題。將資料轉換的步驟有四個:

  1. 從本機端接收其他應用程式所發出的資料
  2. 加密,透過 proxy 傳出
  3. 服務端接到由 Internet 傳來的加密資料,解密
  4. 將資料轉送給當的服務

我們從第一步開始。SSL 服務 J2SE 本身已內置程式庫,名字叫 JSSE。基本上用法跟普通的 Socket 用法一樣,只是多了在認證上和加密上的設定,基本上是不用多理會的。但問題是,為安全起見,預設 SecureSocket 須預先匯入伺服器的認證才可以建立連線,為怕這樣麻煩,我們可以寫一個新的SocketFactory,產生不理會認證是否真確的 SecureSocket。程式碼如下(忘記借用自哪個中國網站了,如知道者請提醒):

public class MySSLSocketFactory extends SSLSocketFactory {
private SSLContext sslContext = null;
public Socket createSocket(Socket arg0, String arg1, int arg2, boolean arg3)
throws IOException {
return getSSLContext().getSocketFactory().createSocket(arg0, arg1, arg2, arg3);
}
...
private static SSLContext createEasySSLContext() {
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] { new X509Manager() },
null);
return context;
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}

X.509 認證管理類別,由於我們不想理會認證的真偽,全回 null 即可。

public class X509Manager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}

下一次將會介紹 SecureSocket 的用法。

Post a Comment