SSL Tunnel implementation on Java(2)

上一回寫到 SecureSocket 不需認證的產生方法,今次該直接寫 SecureSocket 本身的運作了。

我們可以透過

Socket sslsocket = (SSLSocket)MySSLSocketFactory.createSocket(Socket proxyConn, String logicalHost, int logicalPort, true);

在原有的連線 (指連到 Proxy 的連線)建立新的 SSL 連線。

但是,在這之前,我們要跟 Proxy 本身連線,再傳出指令請 Proxy 連到真正的伺服器:

Socket proxyConn = new Socket(String proxyHost, int port);
OutputStream out = proxyConn.getOutputStream();
try {
out.write(cmd.toString().getBytes("ASCII7"));
} catch (UnsupportedEncodingException ignored) {
//ASCII7 Not supported
out.write(cmd.toString().getBytes());
}

cmd 是傳給代理伺服器的建立連線指令。內容如下:
StringBuffer cmd = new StringBuffer();
cmd.append("CONNECT ").append(site).append(':').append(port).append(" HTTP/1.1\r\n");
cmd.append(header + "\r\n");
cmd.append("Proxy-Connection:keep-alive\r\nHost: ").append(site).append("\r\n\r\n");

假設我要建立SSL 連線到 foo.com,指令是這樣的:(\r\n 換列指令不寫出來了,header 變數換成了要假裝的瀏覽器,而以下例子我在假裝 Firefox 1.5)
CONNECT foo.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows;U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5
Proxy-Connection:keep-alive
Host: foo.com

傳送給代理以後,如果連線成功,伺服器會傳回以下訊息:(注意:找字的時候建議把字全換成小階)
HTTP/1.1
200 Connection Established
...

而我們只要找 200 Connection Established 這幾個字,就知道連線有沒有成功了。這個留給大家作練習吧!(其實是我懶寫而已)
下一次會寫真正把本機連線轉到 SSL 的程式碼,也會介紹SSL Tunnel 伺服器及客戶端的分別。

本年最後三個工作天

這三天裏,我休閒得很,也悶得很。Project 順利度過了 UAT,再加上身邊的同事全部選擇去享受他們儲起來的假期,我在辦公室裏所以也沒事可做。

沒有東西可以做實在無聊透頂,而為了補足在工作間的空虛感,我居然動手寫程式 — 為了興趣吧。第一日我在收拾這裏不符合 XHTML 1.1 的地方,也花了我整天時間。第二和第三日呢,我把我的注意力集中放在香港天文台 — 它的氣象服務。原來天文台有提供 XML 天氣資訊服務,但費用實在貴得令人咋舌 (年費港幣 $3,310)。我想由於無人問津,服務也在零五年一月終止。

不過其實也不用透過 XML 才可以從程式取得天氣資訊吧?文字版的天文台網頁格式很整潔,所以也很容易從程式取出有用的資訊,諸如氣溫呀,濕度呀,紫外線指數呀,分區氣溫等等。這幾天我便以 Java 寫這樣的一個類別,以 Regular Expression(常規表達式)取出不同資料。

對了,我在家還把整個 Java class 的程式碼移到 PHP,那便可以在這個伺服器發放相應的 Web Service,給其他網站使用。不過天文台的資訊有版權,所以如果要公開的話我也要取得相關許可才能這樣做。

但不知道發放提取程式的源碼如何呢?情況有點像 BT 或其他 P2P 軟件 — 提取工具本身並不犯法,但提取有版權保護的資訊才會涉及侵權。我想我也可以公開源碼吧,就把那個 Java class 貼出來好了。

還有,祝大家在新的一年,有一個新的開始。新年快樂… 噢,不要「快落」,新年愉快才對。

程式碼在這裏下載。

IBM:沉默的巨人

不久前 IBM 的個人電腦業務正式轉給聯想經營,當然是因為 IBM 個人電腦銷售情況欠佳(這種古老的設計,有人會買嗎?),而大批購買的辦公室電腦又敗給戴爾(Dell)了,PC 市場自然沒有留戀的理由。聯想能不能令那毫無起息的個人電腦業務重新是另一回事,倒想談談 IBM 還有甚麼可以發展的地方。

另一件較廣為人知關於 IBM 的新聞當然是下一代的遊戲主機 PS3,XBox 360 統統轉用 IBM 的 Cell 和 PowerPC 處理器。每顆處理器的利潤我想也有三成吧,但是開發處理器的費用高昂,而 Cell 又不是打零售市場,只做處理器生意看來並不划算。IBM 早前宣佈他們日後的定位是搞 B2B 為企業提供服務,而這又是甚麼樣的服務呢?

IBM 為大公司推出的產品可多著了,可以說是一條龍全包服務:由大型主機(mainframe) 的 zSeries 和 OS/400,中小型伺服器如 iSeries,xSeries,pSeries 等等也是 IBM 的天下 (特別是大型主機方面)。當然還有大型印表機和收銀機,但市場佔有就沒那麼大了。軟體就更厲害了:由網絡整合和管理的 Tivoli 系列,內部通訊的 Lotus,資料庫 DB2(資料庫是最弱的一環啊),應用伺服器及Portal Server WebSphere,軟體開發的 Rational 系列(當然也就包括了 UML 繪圖會用上的 Rational Rose)。

近來 IBM 好像有意「控制」 Java 市場。先是給 Eclipse 開源,後支援 Apache 在搞 Geronimo (J2EE 容器) 和 Harmony (JVM)。Java 的親生老爸 Sun 自然老大不滿意:罵 SWT,屈服了以後又鄙視 Harmony。倒是這次我卻希望 IBM 能成功踩界,不知道是否跟 Sun 的宣傳手法還是 Java 給 Sun 接近完全控制有關。

除了在家用機市場外,我對這家大公司有一點點的好感。也有可能是微軟的手下敗將(大家仍記得 OS/2 嗎?),也可能是近來它在開源上作出的努力。現在 home consumer 成了 Lenovo,我也衷心希望它能站穩住腳,因為我喜歡看大企業打大企業。

What I hate about Java…

Time to do some Java bashing…

我想,要痛恨一個人,最好便是和他/她共事。和他/她共事,你可以真真正正認識他/她的性格,便會知道厭惡他/她的理由。和 Java 共事的這幾個月,我開始有點恨 Java 的瑕疪,而在編譯工作進行的時候,有空看看 Ruby 的 doc,噢,原來 Ruby 這麼美。

Java 有甚麼問題?不,JVM 不是問題。靠寫程式來糊口的人,效能不是我的 concern,反正公司有能力買更快更強的伺服器來 compensate 就是了。那些是系統管理員要注意的事。我著緊的,是語言的自由度和可用性。
Continue reading