第二部分
客戶端
Java 安全套接擴展 (Java Secure Socket Extension
JSSE) 使 Internet 安全通信成為現實
它是 SSL
(Secure Socket Layer) 及 TLS
(Transport Layer Security
由 SSL
改善而來) 的框架和實現
這個包讓 Java 開發人員能夠開發安全的網絡應用
為基於 TCP/IP 的何應用協議
如 HTTP
FTP
Telnet
或者 NTTP
在客戶端和服務器端之間建立安全的數據通道
在這篇文章的第一部分 (服務器端)
作者已經詳細說明了 SSL 和 JSSE
並且說明了如何開發服務器端支持 SSL 應用程序
那一部分中我們開發了一個 HTTPS 服務器
這是一個非常有用的應用程序
在這一部分中同樣會用到它
在這篇文章涉及到客戶端的內容
它首先簡述 JSSE
然後會做這樣一些事情
l 在客戶端使用 JSSE API
l 一步步的開發一個支持 SSL 的客戶端應用程序
l 開發簡單的支持 SSL 的客戶端應用程序
l 從服務器端導出證書並在客戶端導入
l 開發一個支持 SSL 的網頁浏覽器
JSSE
Java 安全套接擴展 (JSSE) 提供了 SSL 和 TLS 協議的框架及實現
JSSE 將復雜的
根本的加密算法抽象化了
這樣就降低了受到敏感或者危險的安全性攻擊的風險
正如你在本文中看到的那樣
由於它能將 SSL 無縫地結合在應用當然
使安全應用的開發變得非常簡單
JSSE 框架可以支撐許多不同的安全通信協議
如 SSL
和
以及 TLS
但是 J
SE v
只實現了 SSL
和 TLS
用 JSSE 編寫客戶端應用程序
JSSE API 提供了擴充的網絡套接字類
信用和密匙管理
以及為簡化套接字創建而設計的套接字工廠框架
以此擴充 java
security 和 兩個包
這些類都包含在 和
ssl 包中
sll
SSLSocketFactory 類是一個創建安全套接字的對象工廠
可以通過下面兩種方法獲得 SSLSocketFactory 的實例
調用 SSLSocketFactory
getDefault 來獲得默認的工廠
默認的工廠被配置為只允許服務器端驗證 (不允許客戶端驗證)
注意許多電子商務網站不需要客戶端驗證
使用指定的配置來構造一個新的工廠 (這不在本文講述的范圍內)
建立 SSLSocketFactory 實例之後
你就可以通過 SSLSocketFactory 實例的 createSocket 方法創建 SSLSocket 對象了
這裡有一個例子
該例通過 SSL 端口
(這是 HTTPS 的默認端口) 創建套接字並連接到 Sun 的 WWW 服務器
// Get a Socket factory
SocketFactory factory = SSLSocketFactory
getDefault();
// Get Socket from factory
Socket socket = factory
createSocket(
);
使用低層的 SSL 套接字
現在
讓我們看一個使用低層套接字在 HTTPS 服務器上打開一個 SSL 套接字連接的完整例子
在這個例子中
打開了一個到 HTTPS 服務器的 SSL 套接字連接
並且讀入默認文檔的內容
示例代碼
展示了這個應用程序
其中用於打開 SSL 套接字的代碼已經加黑顯示了
你將會看到
應用程序中其余代碼就是常規的輸入/輸出流代碼
代碼示例
ReadHttpsURL
import
*;
import
*;
import
ssl
*;
public class ReadHttpsURL
{
static final int HTTPS_PORT =
;
public static void main(String argv[]) throws Exception {
if (argv
length !=
) {
System
out
println(
Usage: java ReadHttpsURL
);
System
exit(
);
}
// Get a Socket factory
SocketFactory factory = SSLSocketFactory
getDefault();
// Get Socket from factory
Socket socket = factory
createSocket(argv[
]
HTTPS_PORT);
BufferedWriter out
= new BufferedWriter(new OutputStreamWriter(socket
getOutputStream()));
BufferedReader in
= new BufferedReader(new InputStreamReader(socket
getInputStream()));
out
write(
GET / HTTP/
\n\n
);
out
flush();
String line;
StringBuffer sb = new StringBuffer();
while((line = in
readLine()) != null) {
sb
append(line);
}
out
close();
in
close();
System
out
println(sb
toString());
}
}
用這個應用程序進行實驗
拷貝 ReadHttpsURL
類的代碼並粘貼到一個新文件中
將該文件改名為 ReadHttpsURL
java
並保存在一個你指定的目錄下
使用 javac 編譯 ReadHttpsURL
java
運行 ReadHttpsURL
並提供一個域名作為參數
如
Prompt> java ReadHttpsURL
幾秒種後
你會看到許多 HTML 代碼顯示在屏幕上
注意
即使我們提供的是域名
我們打開的連接也是
這是因為我們使用的端口號
是 HTTPS 的默認端口號
再試試另一個例子
如
Prompt> java ReadHttpsURL
www
jam
ca
這次運行會拋出如下所示的異常
你能猜到是為什麼嗎?
Exception in thread
main
ssl
SSLHandshakeException: java
security
cert
CertificateException: Couldn
t find trusted certificate at
ssl
internal
ssl
BaseSSLSocketImpl
a(DashoA
)
緣於一個很好的理由
它不能運行——因為遠端的服務器發送了一個客戶端不認識的證書
我在本文的第一部分提到過
當客戶端連接服務器的時候
服務器發送它的證書到客戶端請求驗證
這樣
第一個例子中
你進入了
服務器的確發送了證書
但 Java 檢查了默認的證書庫並認出了這個證書是由可信任的 CA 產生的
默認情況下
Java 信任這個 CA
第二個例子中
你進入的是 www
jam
ca
那個網端的證書不是它自己產生的
就是由一個 Java 不知道的 CA 產生的
因此不受信任
注意
如果系統時鐘沒有設置正確
那麼它的時間就可能在證書的有效期之外
服務器會認為證書無效並拋出 CertificateException 異常
為了讓示例正確運行
你得從 www
jam
ca 導入證收到 Java 信任的證書庫中
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27495.html