熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

用J2SE 1.4 進行 Internet 安全編程(一)

2013-11-23 19:48:57  來源: Java高級技術 

  第二部分客戶端
  
  Java 安全套接擴展 (Java Secure Socket Extension JSSE) 使 Internet 安全通信成為現實它是 SSL (Secure Socket Layer) 及 TLS (Transport Layer Security由 SSL 改善而來) 的框架和實現這個包讓 Java 開發人員能夠開發安全的網絡應用為基於 TCP/IP 的何應用協議如 HTTPFTPTelnet或者 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 但是 JSE v 只實現了 SSL 和 TLS
  
  用 JSSE 編寫客戶端應用程序
  
  JSSE API 提供了擴充的網絡套接字類信用和密匙管理以及為簡化套接字創建而設計的套接字工廠框架以此擴充 javasecurity 和 兩個包這些類都包含在 和 ssl 包中
  
  sllSSLSocketFactory 類是一個創建安全套接字的對象工廠可以通過下面兩種方法獲得 SSLSocketFactory 的實例
  
  調用 SSLSocketFactorygetDefault 來獲得默認的工廠默認的工廠被配置為只允許服務器端驗證 (不允許客戶端驗證)注意許多電子商務網站不需要客戶端驗證
  
  使用指定的配置來構造一個新的工廠 (這不在本文講述的范圍內)
  
  建立 SSLSocketFactory 實例之後你就可以通過 SSLSocketFactory 實例的 createSocket 方法創建 SSLSocket 對象了這裡有一個例子該例通過 SSL 端口 (這是 HTTPS 的默認端口) 創建套接字並連接到 Sun 的 WWW 服務器
  
  // Get a Socket factory
  
  SocketFactory factory = SSLSocketFactorygetDefault();
  
  // Get Socket from factory
  
  Socket socket = factorycreateSocket( );
  
  使用低層的 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 (argvlength != ) {
  
   Systemoutprintln(Usage: java ReadHttpsURL );
  
   Systemexit();
  
   }
  
   // Get a Socket factory
  
   SocketFactory factory = SSLSocketFactorygetDefault();
  
   // Get Socket from factory
  
   Socket socket = factorycreateSocket(argv[] HTTPS_PORT);
  
   BufferedWriter out
  
   = new BufferedWriter(new OutputStreamWriter(socketgetOutputStream()));
  
   BufferedReader in
  
   = new BufferedReader(new InputStreamReader(socketgetInputStream()));
  
   outwrite(GET / HTTP/\n\n);
  
   outflush();
  
   String line;
  
   StringBuffer sb = new StringBuffer();
  
   while((line = inreadLine()) != null) {
  
   sbappend(line);
  
   }
  
   outclose();
  
   inclose();
  
   Systemoutprintln(sbtoString());
  
   }
  
  }
  
  用這個應用程序進行實驗
  
  拷貝 ReadHttpsURL 類的代碼並粘貼到一個新文件中將該文件改名為 ReadHttpsURLjava並保存在一個你指定的目錄下
  
  使用 javac 編譯 ReadHttpsURLjava
  
  運行 ReadHttpsURL 並提供一個域名作為參數
  
  Prompt> java ReadHttpsURL
  
  幾秒種後你會看到許多 HTML 代碼顯示在屏幕上注意即使我們提供的是域名 我們打開的連接也是 這是因為我們使用的端口號 是 HTTPS 的默認端口號
  
  再試試另一個例子
  
  Prompt> java ReadHttpsURL wwwjamca
  
  這次運行會拋出如下所示的異常你能猜到是為什麼嗎?
  
  Exception in thread main sslSSLHandshakeException: javasecuritycertCertificateException: Couldnt find trusted certificate at sslinternalsslBaseSSLSocketImpla(DashoA)
  
  緣於一個很好的理由它不能運行——因為遠端的服務器發送了一個客戶端不認識的證書我在本文的第一部分提到過當客戶端連接服務器的時候服務器發送它的證書到客戶端請求驗證這樣第一個例子中你進入了 服務器的確發送了證書但 Java 檢查了默認的證書庫並認出了這個證書是由可信任的 CA 產生的默認情況下Java 信任這個 CA第二個例子中你進入的是 wwwjamca那個網端的證書不是它自己產生的就是由一個 Java 不知道的 CA 產生的因此不受信任
  
  
  注意如果系統時鐘沒有設置正確那麼它的時間就可能在證書的有效期之外服務器會認為證書無效並拋出 CertificateException 異常
  
  為了讓示例正確運行你得從 wwwjamca 導入證收到 Java 信任的證書庫中

From:http://tw.wingwit.com/Article/program/Java/gj/201311/27495.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.