俊星的BLOG

          HTTP Client及HTTPS初探

          HTTP Client是一個客戶端HTTP協議的類庫
          1、首先是下載APACHE HTTP CLIENT相關的JAR,目前我引入到工程中的相關文件時:
          httpclient-4.0.3.jar
          httpcore-4.0.1.jar
          httpmime-4.0.3.jar
          commons-codec-1.4.jar
          commons-logging-1.1.1.jar

          JAR包之前的引用關系在README等相關說明中已有。

          2、下載并運行TOMCAT,我下載的是TOMCAT6(對應的是JDK5),主要注意的是需要配置CATALINA_HOME這個環境變量。

          3、制作服務器端證書,下面是我一個示例:
          C:\Documents and Settings\dingjunxing>keytool -genkey -alias tomcat3 -keystore F
          :\eclipse\workspace\httpc\tomcat3.keystore
          輸入keystore密碼:  
          123456
          您的名字與姓氏是什么?
            [Unknown]:  localhost
          您的組織單位名稱是什么?
            [Unknown]:  sz
          您的組織名稱是什么?
            [Unknown]:  sz
          您所在的城市或區域名稱是什么?
            [Unknown]:  shenzhen
          您所在的州或省份名稱是什么?
            [Unknown]:  guangdong
          該單位的兩字母國家代碼是什么
            [Unknown]:  cn
          CN
          =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn 正確嗎?
            [否]:  y
          輸入
          <tomcat3>的主密碼
                  (如果和 keystore 密碼相同,按回車):  
          123456

          4、根據服務器證書導出客戶端證書,有兩種方式,一種為采用IE,下面提供一個利用KEY TOOL導出的方式:
          keytool -export -file tomcat3.cert -alias tomcat3 -keystore F:\eclipse\workspace\httpc\tomcat3.keystore
          注意:上面命令行必須進入到
          %java_home%/jre/lib/security中。

          5、將獲取到的客戶端證書導入:
          C:\Program Files\Java\jdk1.5.0_15\jre\lib\security>keytool -import -keystore cac
          erts 
          -file F:\eclipse\workspace\httpc\tomcat3.cert
          輸入keystore密碼:  
          123456
          Owner: CN
          =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
          發照者: CN
          =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
          序號: 4cc55438
          有效期間: Mon Oct 
          25 17:56:08 CST 2010 至: Sun Jan 23 17:56:08 CST 2011
          認證指紋:
                   MD5:  E4:2E:BE:AC:A1:5D:E0:
          95:C7:95:93:BF:B3:F3:EE:5E
                   SHA1: F8:9A:BB:FA:C8:C5:8A:D2:FA:
          98:A1:95:64:65:42:9A:8F:0B:4A:7D
          信任這個認證? [否]:  y
          認證已添加至keystore中

          6、TOMCAT中相關設置,主要是修改CATALINA_HOME下的conf/server.xml,在其中添加如下一個連接器:
          <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
                         maxThreads
          ="150" scheme="https" secure="true"
                         clientAuth
          ="false" sslProtocol="TLS" keystoreFile="F:\eclipse\workspace\httpc\tomcat3.keystore" keystorePass="123456"/>    

          7、運行相關代碼:
          package org.apache.http.examples.client;

          import java.io.File;
          import java.io.FileInputStream;
          import java.security.KeyStore;

          import org.apache.http.HttpEntity;
          import org.apache.http.HttpResponse;
          import org.apache.http.client.methods.HttpGet;
          import org.apache.http.conn.scheme.Scheme;
          import org.apache.http.conn.ssl.SSLSocketFactory;
          import org.apache.http.impl.client.DefaultHttpClient;

          /**
           * This example demonstrates how to create secure connections with a custom SSL
           * context.
           
          */
          public class ClientCustomSSL {

              
          public static void main(String[] args) throws Exception {
                  DefaultHttpClient httpclient 
          = new DefaultHttpClient();

                  KeyStore trustStore 
          = KeyStore.getInstance(KeyStore.getDefaultType());
                  FileInputStream instream 
          = new FileInputStream(new File("tomcat3.keystore"));
                  
          try {
                      trustStore.load(instream, 
          "123456".toCharArray());
                  } 
          finally {
                      instream.close();
                  }

                  SSLSocketFactory socketFactory 
          = new SSLSocketFactory(trustStore);
                  Scheme sch 
          = new Scheme("https", socketFactory, 8443);
                  httpclient.getConnectionManager().getSchemeRegistry().register(sch);

                  HttpGet httpget 
          = new HttpGet("https://localhost:8443/docs");

                  System.out.println(
          "executing request" + httpget.getRequestLine());

                  HttpResponse response 
          = httpclient.execute(httpget);
                  HttpEntity entity 
          = response.getEntity();

                  System.out.println(
          "----------------------------------------");
                  System.out.println(response.getStatusLine());
                  
          if (entity != null) {
                      System.out.println(
          "Response content length: " + entity.getContentLength());
                  }
                  
          if (entity != null) {
                      entity.consumeContent();
                  }

                  
          // When HttpClient instance is no longer needed,
                  
          // shut down the connection manager to ensure
                  
          // immediate deallocation of all system resources
                  httpclient.getConnectionManager().shutdown();
              }

          }
          運行結果正常,當然也可以通過在瀏覽器中輸入“https://localhost:8443/”的方式進行訪問。

          posted on 2010-10-25 20:13 俊星 閱讀(1990) 評論(2)  編輯  收藏

          評論

          # 第五步出錯 2010-11-22 15:39 ahome

          俊星兄,我按照你的步驟一步步做下來,做到第五步出錯了。我的環境是jdk1.6.0_14和tomcat6.0.14。錯誤提示如下:
          keytool錯誤:java.io.IOException KeyStore was tampered with,or password was incorrect

          近期項目中需要用到https登錄,急切盼望您的回復,我的Q:724895731,可以發到我郵箱或者直接Q我,白天一般隱身。小弟先謝謝您!  回復  更多評論   

          # 登錄網站 2010-11-22 16:02 ahome

          我要是實現的功能是這樣的,用Java程序登錄網站,例
          http://vark.com,登錄地址https://vark.com/session,用戶名:kate658735@qq.com,密碼:ahomevark,登錄要發送的參數:session[email] kate658735@qq.com
          session[password] ahomevark
          commit Sign in
          我使用上面的代碼用post提交參數,拋出異常。麻煩你介紹一下解決方案,小弟不勝感激。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 武义县| 都兰县| 泊头市| 商都县| 贡嘎县| 海兴县| 沁阳市| 广东省| 礼泉县| 金塔县| 汶川县| 永春县| 华安县| 崇礼县| 芦溪县| 九台市| 淳化县| 赣州市| 福海县| 清新县| 海伦市| 喀喇沁旗| 定兴县| 肥城市| 济阳县| 剑河县| 阿拉善左旗| 青州市| 平乡县| 九龙坡区| 海原县| 德惠市| 泰顺县| 格尔木市| 汪清县| 桦甸市| 汉沽区| 枣强县| 千阳县| 临沧市| 汕尾市|