使用HttpClient發送HTTPS請求以及配置Tomcat支援SSL

來源:互聯網
上載者:User

這裡使用的是HttpComponents-Client-4.1.2

package com.jadyer.util;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.UnrecoverableKeyException;import java.security.cert.CertificateException;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.ParseException;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;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;import org.apache.http.util.EntityUtils;/** * 使用HttpClient類比HTTPS訪問 * @see =================================================================================================================================== * @see 【配置Tomcat支援SSL(即讓Tomcat下的Web應用處於SSL安全通道中)】 * @see =================================================================================================================================== * @see 1、產生KeyStore * @see    1)運行-->CMD-->"keytool -genkey -alias Jadyer_SSL_20120508 -keyalg RSA -validity 1024 -keystore D:\Jadyer_SSL_20120508.keystore" * @see      參數說明----->-genkey  表示產生密鑰 * @see                   -alias    指定別名,這裡是Jadyer_SSL_20120508 * @see                   -keyalg   指定演算法,這裡是RSA * @see                   -validity 指定認證有效期間,這裡是1024天 * @see                   -keystore 指定儲存位置,這裡是D:\\Jadyer_SSL_20120508.keystore * @see    2)CMD輸出----->輸入keystore密碼:hongyu75 * @see                   再次輸入新密碼:hongyu75 * @see                   您的名字與姓氏是什嗎?[Unknown]:127.0.0.1(這裡要根據實際情況填寫網站網域名稱或者IP,否則會出現認證上的名稱無效) * @see                   您的組織單位名稱是什嗎?[Unknown]:http://blog.csdn.net/jadyer * @see                   您的組織名稱是什嗎?[Unknown]:JavaLover_jadyer * @see                   您所在的城市或地區名稱是什嗎?[Unknown]:BJ * @see                   您所在的州或省份名稱是什嗎?[Unknown]:BJ_NanTian * @see                   該單位的兩字母國家代碼是什麼[Unknown]:CN * @see                   CN=127.0.0.1, OU=http://blog.csdn.net/jadyer, O=JavaLover_jadyer, L=BJ, ST=BJ_NanTian, C=CN 正確嗎?[否]:Y * @see                   輸入<Jadyer_SSL_20120508>的主密碼(如果和 keystore 密碼相同,按斷行符號):這裡按斷行符號鍵 * @see                   (這裡的主密碼一定要與keystore密碼相同,否則啟動Tomcat時就會告訴你java.io.IOException: Cannot recover key) * @see    3)接下來就會按照-keystore參數值在指定位置產生指定的KeyStore檔案了 * @see =================================================================================================================================== * @see 2、讓Tomcat支援SSL * @see    1)將產生的Jadyer_SSL_20120508.keystore拷貝到\\%TOMCAT_HOME%\\conf\\目錄中(其它目錄也可以) * @see    2)修改\\%TOMCAT_HOME%\\conf\\server.xml檔案(大約在85行的位置),新增內容如下 * @see      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" * @see                 maxThreads="150" scheme="https" secure="true" * @see                 clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8" * @see                 keystoreFile="conf/Jadyer_SSL_20120508.keystore" keystorePass="hongyu75"/> * @see    3)這樣,我們的Tomcat就支援HTTPS訪問了(關於<Connector/>標籤中的屬性說明,參拜Google大神) * @see =================================================================================================================================== * @see 3、用瀏覽器訪問我們的應用 * @see   1)輸入https://127.0.0.1:8443/blog會發現你的應用已經處於SSL安全通道中了 * @see     此時,如果我們在瀏覽器裡訪問http://127.0.0.1:8443/blog會發現,竟然能訪問 * @see     也就是說,我們雖然啟用了HTTPS,但現在還可以繞開HTTPS直接存取HTTP還能,這樣HTTPS也就起不到作用了 * @see   2)我們可以配置一下\\%TOMCAT_HOME%\\conf\\web.xml檔案,使得HTTP的訪問能夠重新導向到HTTPS的串連 * @see     修改位置大約為web.xml的1224行,即在</welcome-file-list>標籤後面加入下面的內容,即可 * @see     <security-constraint> * @see     <!-- Authorization setting for SSL --> * @see     <web-resource-collection> * @see     <web-resource-name>SSL_App</web-resource-name> * @see     <!-- 指明需要SSL的url --> * @see     <url-pattern>/*</url-pattern> * @see     <http-method>GET</http-method> * @see     <http-method>POST</http-method> * @see     </web-resource-collection> * @see     <user-data-constraint> * @see     <!-- 指明需要SSL --> * @see     <transport-guarantee>CONFIDENTIAL</transport-guarantee> * @see     </user-data-constraint> * @see     </security-constraint> * @see =================================================================================================================================== * @author http://blog.csdn.net/jadyer * @editor Feb 1, 2012 3:02:27 PM */public class HttpClientUtil {public static void main(String[] args)throws Exception{//String requestUrl = "http://127.0.0.1:8088/test/web/userac";String requestUrl = "https://127.0.0.1:8443/test/web/userac";System.out.println(sendSSLRequest(requestUrl));}/** * 發送HTTPS請求 * @param requestUrl 請求的地址 * @return 響應內容 */@SuppressWarnings("finally")public static String sendSSLRequest(String requestUrl){long responseLength = 0;       //響應長度String responseContent = null; //響應內容HttpClient httpClient = new DefaultHttpClient(); //建立預設的httpClient執行個體try {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());FileInputStream fis = new FileInputStream(new File("F:\\Tool\\IDE\\Jadyer_SSL_20120508.keystore"));try {trustStore.load(fis, "hongyu75".toCharArray()); //載入KeyStore} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (CertificateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}}SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);   //建立Socket工廠,將trustStore注入Scheme sch = new Scheme("https", 8443, socketFactory);               //建立SchemehttpClient.getConnectionManager().getSchemeRegistry().register(sch); //註冊SchemeHttpGet httpGet = new HttpGet(requestUrl);           //建立HttpGetHttpResponse response = httpClient.execute(httpGet); //執行GET請求HttpEntity entity = response.getEntity();            //擷取響應實體if (null != entity) {responseLength = entity.getContentLength();responseContent = EntityUtils.toString(entity, "UTF-8");EntityUtils.consume(entity); //Consume response content}System.out.println("請求地址: " + httpGet.getURI());System.out.println("響應狀態: " + response.getStatusLine());System.out.println("響應長度: " + responseLength);System.out.println("響應內容: " + responseContent);} catch (KeyManagementException e) {e.printStackTrace();} catch (UnrecoverableKeyException e) {e.printStackTrace();} catch (KeyStoreException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {httpClient.getConnectionManager().shutdown(); //關閉串連,釋放資源return responseContent;}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.