1. 程式人生 > >HTTPS 客戶端傳送請求(二)

HTTPS 客戶端傳送請求(二)

https 完整web開發

Tomcat 6.0 配置

1、生成安全訪問的證書。

命令列下執行:keytool -genkey -alias tomcat -keyalg RSA -keystore c:\tomcat.keystore

然後按提示輸入一些密碼等資訊:

輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
   [Unknown]:  tomcat
您的組織單位名稱是什麼?
   [Unknown]:  tomcat

您的組織名稱是什麼?
   [Unknown]:  tomcat
您所在的城市或區域名稱是什麼?
   [Unknown]:  bj
您所在的州或省份名稱是什麼?
   [Unknown]:  bj
該單位的兩字母國家程式碼是什麼
   [Unknown]:  cn
CN=tomcat, OU=tomcat, O=tomcat, L=bj, ST=bj, C=cn 正確嗎?
   [否]:  y

輸入<tomcat>的主密碼
         (如果和 keystore 密碼相同,按回車):



輸入完成後,會在C盤下生成tomcat.keystore檔案,這個檔案的位置不做要求。

注:上述命令中的藍色部分可以不輸入,這樣會預設生成一個.keystore的證書檔案。

2、配置tomcat,使其支援https連線。

開啟tomcat目錄下conf/server.xml檔案,將之前的連線部分註釋,找到以下節點:

<!-- Define a SSL HTTP/1.1 Connector on port 8443
          This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
          described in the APR documentation -->
     <!--
     <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
                clientAuth="false" sslProtocol="TLS" />
     -->


 
將<connectore節點的註釋去掉,8443修改為你要使用的埠。節點中新增兩個屬性:keystoreFile="C:/tomcat.keystore" keystorePass="123456"

其中,keystoreFile指的是你第一步生成的證書檔案位置,keystorePass是你在生成證書時所輸入的密碼。
 
通過以上兩步操作,基本上就可以使用https訪問tomcat連線了,不過我在使用tomcat6配置的時候,啟動tomcat報錯:

2011-9-8 10:11:20 org.apache.catalina.core.AprLifecycleListener init
 資訊: Loaded APR based Apache Tomcat Native library 1.1.20.
 2011-9-8 10:11:20 org.apache.catalina.core.AprLifecycleListener init
 資訊: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
 2011-9-8 10:11:20 org.apache.catalina.startup.SetAllPropertiesRule begin
 警告: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'keystoreFile' to 'C:\tomcat.keystore' did not find a matching property.
 2011-9-8 10:11:20 org.apache.catalina.startup.SetAllPropertiesRule begin
 警告: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'keystorePass' to 'mvtech' did not find a matching property.
 2011-9-8 10:11:20 org.apache.catalina.startup.SetAllPropertiesRule begin
 警告: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'clientAuth' to 'false' did not find a matching property.
 2011-9-8 10:11:20 org.apache.coyote.http11.Http11AprProtocol init
 嚴重: Error initializing endpoint
 java.lang.Exception: No Certificate file specified or invalid file format
  at org.apache.tomcat.jni.SSLContext.setCertificate(Native Method)
  at org.apache.tomcat.util.net.AprEndpoint.init(AprEndpoint.java:720)
  at org.apache.coyote.http11.Http11AprProtocol.init(Http11AprProtocol.java:107)
  at org.apache.catalina.connector.Connector.initialize(Connector.java:1014)
  at org.apache.catalina.core.StandardService.initialize(StandardService.java:680)
  at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795)
  at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
  at org.apache.catalina.startup.Catalina.load(Catalina.java:548)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
 2011-9-8 10:11:20 org.apache.catalina.startup.Catalina load
 嚴重: Catalina.start
 LifecycleException:  Protocol handler initialization failed: java.lang.Exception: No Certificate file specified or invalid file format
  at org.apache.catalina.connector.Connector.initialize(Connector.java:1016)
  at org.apache.catalina.core.StandardService.initialize(StandardService.java:680)
  at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795)
  at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
  at org.apache.catalina.startup.Catalina.load(Catalina.java:548)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)


在網上看到有朋友的解決辦法,是找到tomcat的bin目錄下有個tcnative-1.dll檔案,然後將其刪除,重新啟動tomcat一切正常。

至此,可以通過https方式訪問你的應用了。

但是此時如果你用Http方式訪問應用,頁面會返回亂碼或者空,但是也不報錯,為了更好的使用,我們需要在客戶輸入http時能夠自動跳轉到Https方式,這就需要第三步,讓你的應用強制使用https方式訪問了。
 
開啟tomcat下conf/web.xml檔案,在最下方的<welcome-file-list>節點之後新增:

<login-config>   
    <!-- Authorization setting for SSL -->   
    <auth-method>CLIENT-CERT</auth-method>   
    <realm-name>Client Cert Users-only Area</realm-name>   
    </login-config>   
    <security-constraint>   
        <!-- Authorization setting for SSL -->   
        <web-resource-collection >   
            <web-resource-name >SSL</web-resource-name>   
            <url-pattern>/*</url-pattern>   
        </web-resource-collection>   
        <user-data-constraint>   
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>   
        </user-data-constraint>   
    </security-constraint>   

配置完成。。。。。。

原始碼解析

服務端

服務端的構建比較簡單,一個action搞定

package com.httpsDemo.action;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PostHttpsAction extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("post success ...");
		InputStream in = req.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		String result = br.readLine();
		System.out.println(result);
		resp.getOutputStream().write(result.getBytes("utf-8"));
		return;
	}

}

注意web.xml配置.

客戶端

工具類一個搞定

package com.saygou.weixin;
 
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
 

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
 
public class HttpsUtil {
 
    private static class TrustAnyTrustManager implements X509TrustManager {
 
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[] {};
        }
    }
 
    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
 
    /**
     * post方式請求伺服器(https協議)
     * 
     * @param url
     *            請求地址
     * @param content
     *            引數
     * @param charset
     *            編碼
     * @return
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     * @throws IOException
     */
    public static byte[] post(String url, String content, String charset)
            throws NoSuchAlgorithmException, Exception,
            IOException {
        SSLContext sc = SSLContext.getInstance("SSL","SunJSSE");
        sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },
                new java.security.SecureRandom());
 
        URL console = new URL(url);
        HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
        conn.setSSLSocketFactory(sc.getSocketFactory());
        //設定預設證書--如果沒有這句將會報錯,錯誤資訊↓↓↓
        //java.io.IOException: HTTPS hostname wrong:  should be <127.0.0.1> 
        conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
        conn.setDoOutput(true);
        conn.connect();
        DataOutputStream out = new DataOutputStream(conn.getOutputStream());
        out.write(content.getBytes(charset));
        // 重新整理、關閉
        out.flush();
        out.close();
        InputStream is = conn.getInputStream();
        if (is != null) {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            is.close();
            return outStream.toByteArray();
        }
        return null;
    }
    
   /**
    * 測試
    * @param args
    * @throws Exception
    */
 
    public static void main(String[] args) throws Exception {
    	try {
			byte[] b = HttpsUtil.post("https://127.0.0.1:8443/httpsDemo/hs", "{'name':'Jack'}", "utf-8");
			System.out.println(new String(b));
		} catch (KeyManagementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

相關推薦

HTTPS 客戶傳送請求()

https 完整web開發 Tomcat 6.0 配置 1、生成安全訪問的證書。 命令列下執行:keytool -genkey -alias tomcat -keyalg RSA -keystore c:\tomcat.keystore 然後按提示輸入一些密碼等資訊: 輸入

【網路】JAVA Socket 實現HTTP與HTTPS客戶傳送POST與GET方式請求

JAVA Socket 實現HTTP與HTTPS客戶端傳送POST與GET方式請求 哇,一看標題怎麼這麼長啊,其實意思很簡單,哥討厭用HTTP Client做POST與GET提交 覺得那個畢竟是別人寫得API庫,所以我就自己實現了一個簡單的HTTP客戶端,支援POST 方

tcp socket客戶傳送請求連線http服務

首先模擬一個http服務端,用於接收請求 package bhpp.rsserver.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS

dubbo遠端呼叫原始碼分析(一):客戶傳送請求

dubbo遠端呼叫的原始碼分析,分成了三篇文章地址分別如下:本文分為三部分,分別是:消費端註冊部分消費端動態代理部分消費端事件處理器部分消費端註冊部分在分析dubbo遠端呼叫的時候,要從dubbo消費端(consumer)註冊開始說起dubbo的consumer在註冊的時候,

探究Spring Boot中的接收引數問題與客戶傳送請求傳遞資料

結合此篇參考[Spring框架學習筆記(9)——API介面設計相關知識及具體編碼實現](https://www.cnblogs.com/stars-one/p/12305429.html) 在使用Spring Boot進行接收引數的時候,發現了許多問題,之前一直都很忙,最近才稍微有空研究一下此問題。 網上

Java後臺與微信公眾號互動----接收並處理微信客戶傳送請求

還是一樣,理論就不說了,直接上程式碼! 在進行這個操作之前,必須得與微信客戶端進行比對成功才行,具體可參考上一篇部落格。 doGet()是上一篇部落格已經說了的,在這裡就不詳細說了。 public class WeChatServlet extends HttpServlet { /

客戶傳送的post請求,request中的中文亂碼問題

客戶端通過httpclient進行呼叫,採用的是post的方式。服務端引用普通的struts2或者springmvc框架。如果post引數中有亂碼,則我們需要確認兩個地方來確保亂碼的問題所在。第一個傳送請求的httpclient客戶端使用的編碼格式是什麼,是gdk還是utf

Android TCP的客戶請求傳送和響應結果接收)

Android TCP客戶端傳送請求並接收響應 <span style="font-size:14px;"> import android.util.Log; import com.changhong.electric_controll.UDPRespons

GET與POST比較-使用HTTP協議將客戶請求傳送到伺服器的兩種方式

1、get是從伺服器上獲取資料,post是向伺服器傳送資料;2、 在客戶端,get方式在通過URL提交資料,資料在URL中可以看到,post方式資料放置在HTML HEADER內提交;3、 對於ge

C#客戶傳送http請求與伺服器通訊

本文介紹瞭如何使用C#,通過HttpWebRequest方法,向服務端傳送get,post,put和delete請求 環境介紹 軟體 vs2013 程式語言c# winform 服務端採用java+spring,restful風格 在客戶端,通過H

、Servlet客戶HTTP請求和服務HTTP響應

Servlet客戶端HTTP請求和服務端HTTP響應 關於HTTP知識的補充 B/S程式結構 JavaWeb是用於開發B/S模式的動態網頁技術,主要包含 JSP、 Servlet等元件規範。 HTTP 訊息結構: HTTP是基於客戶端/服務端

C# https客戶獲取證書的工具方法

cas cer flag data- 附加 1-1 plain start html 1. 導入證書到個人計算機中2. 獲取證書 [csharp] view plain copy print? private static X509Certificate2

創建http客戶請求其他服務接口(GET/POST)

useragent 解析 point ons 風格 獲取 turn cover init service1擁有接口 : GET user/{user_id} POST user/add service2調用service1的接口獲取數據 1.創建客戶端 /

9.1 客戶發起請求源碼

getbean 負載均衡器 tostring router selected 請求參數 object 隨機 vol 來看一下客戶端請求代碼: 1 DemoService demoService = (DemoService) context.getBean

CAS客戶整合() Zabbix

接口 bus markdown init else default function https ssl Zabbix是一個強大的服務器/交換機監控應用,有zabbix-server, zabbix-client, zabbix-web 三部分。zabbix-web管理端

Nginx支持反爬蟲並限制客戶請求的並發數

反爬蟲並限制客戶端請求的並發數cat /usr/local/nginx/conf/agent_deny.conf if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapart

https客戶遇到過的問題

cst -s port keys 方法 href tps sdn html   1、用.p12格式的證書,在windows上調試完全沒問題,在Linux服務器上,提示無效證書格式。   解決方法:將.p12格式的證書轉換為.jks格式的證書。   將.p12格式的證書轉換為

restlet 客戶發起請求,連線超時設定

此客戶端建立 是使用restlet 實現。 需要restlet 的基礎jar包,org.restlet.jar,org.restlet.ext.servlet.jar. 這兩個jar 可以實現基本的rest服務。 客戶端發起請求還需要其他相關jar包。如下 * 需要依賴org.res

前端向後傳送請求,後返回的一個值的請求的store方法

//前端js程式碼 1 var store = Ext.create(util.getCodeGenerate1ClassName('延續食品經營許可申請','store'), { 2 httpGetRequestExParams: { /

Unity客戶框架筆記(元件實體開發模式的思考)

https://blog.csdn.net/langresser_king/article/details/46324977 Unity客戶端框架筆記二(元件實體開發模式的思考) 2015年06月02日 11:40:13 langresser 閱讀數:4315更多 個