HttpClient 访问https来

原创
2015/01/10 19:14
阅读数 381

一、首先了解http协议

1.socket.  GET请求

Socket socket = new Socket("www.baidu.com", 80);    
		// 请求服务器  
		OutputStream out = socket.getOutputStream();  
		PrintWriter pw = new PrintWriter(out);  
		pw.println("GET / HTTP/1.1");  // 请求的第一行Request-Line,  
		pw.println("Host: www.baidu.com");  // 请求头,Host是必须的  
		pw.println("User-Agent: Mozilla/5.0 (Windows NT 6.1; IE 9.0)"); //请求的机器信息
		//
		//pw.println("Content-Type: application/x-www-form-urlencoded");
		pw.println();//最后一行是空的信息
		pw.flush();  // 提交请求  
		// 获取服务器响应  
		InputStream is = socket.getInputStream();
		InputStreamReader reader = new InputStreamReader(is);
		    
		// 输出响应内容    
		while (true) {
			System.out.print((char)reader.read());
		}

2.socket POST的时候参数 这个还没确定

pw.println("Content-Type: application/x-www-form-urlencoded");
pw.println("Content-Length: length
pw.println();
pw.println("---------------"); //

3.SSL/TLS HTTPS

 图解SSL/TLS协议

// 自定义的管理器
		    X509TrustManager xtm = new DefaultTrustManager();
		    TrustManager mytm[] = { xtm };
		    // 得到上下文
		    SSLContext ctx = SSLContext.getInstance("SSL");
		    // 初始化
		    ctx.init(null, mytm, null);
		    // 获得工厂
		    SSLSocketFactory factory = ctx.getSocketFactory();
		    // 从工厂获得Socket连接
//		    String url="https://kyfw.12306.cn/otn/leftTicket/init";
		    Socket socket = factory.createSocket("kyfw.12306.cn", 443);
		    // 剩下的就和普通的Socket操作一样了

		    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

		    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		    out.write("GET /otn/leftTicket/init HTTP/1.1\r\n");
		    out.write("Host: kyfw.12306.cn\r\n");  // 请求头,Host是必须的  
		    out.write("User-Agent: Mozilla/5.0 (Windows NT 6.1; IE 9.0)\r\n"); //请求的机器信息
		    out.write("\r\n");
		    out.flush();
		    System.out.println("start   work!");
		    String line;
		    StringBuffer sb = new StringBuffer();
		    while ((line = in.readLine()) != null) {
		      sb.append(line + "\n");
		    }
		    out.close();
		    in.close();
		    System.out.println(sb.toString());

 

二、首先下个HttpClient来

1.找了个3.0的HttpClient,4的感觉还用不来,先这样吧

2.基本的get用法效果

public static void main(String[] args) {
     HttpClient client=new HttpClient();
     int result=0;
     try {
//     GetMethod get=new GetMethod("http://www.baidu.com");
//		int result=client.executeMethod(get);
//		System.out.println("访问结果:"+result);
		
    	GetMethod get=new GetMethod("https://kyfw.12306.cn/otn/leftTicket/init");
		result=client.executeMethod(get);
		System.out.println("访问结果:"+result);
	} catch (IOException e) {
		e.printStackTrace();
	}

这里面大致有两个问题来

1.正常的http可以访问的,

  有些 有些https://github.com/  居然也返回200了 这个下面再了解来

2.像上面的这个https访问直接异常了

3.httpclient访问

 三、证书的

证书原理

证书链

 最终感觉就是证书是个第三方公认的机构然后去买的

了解点实际的

 

//证书管理 自定义实现 里面有三个方法
class DefaultTrustManager implements X509TrustManager{

	@Override
	public void checkClientTrusted(X509Certificate[] arg0, String arg1)
			throws CertificateException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void checkServerTrusted(X509Certificate[] arg0, String arg1)
			throws CertificateException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public X509Certificate[] getAcceptedIssuers() {
		// TODO Auto-generated method stub
		return null;
	}

X509Certificate 

遍历验证获取证书内容,证书的有效性和检测

 

SSLSOcket的使用

四、使用

不仅可以用来访问认证

也可以用来进行跨域的转发

 

 

 

 


 

展开阅读全文
打赏
0
2 收藏
分享
加载中
怎么获取证书信息
2015/03/02 22:39
回复
举报
更多评论
打赏
1 评论
2 收藏
0
分享
返回顶部
顶部