JAVA操作SSL协议,通过Socket访问Https的程序代码例子

今天有人问,需要访问HTTPS的网站,作为client访问基于HTTPS的webservices,client这边通过设置以下系统参数,是可以成功的,
System.setProperty("javax.net.ssl.keyStore", keystoreFile);
System.setProperty("javax.net.ssl.keyStorePassword",keystorePassword);
System.setProperty("javax.net.ssl.trustStore", truststoreFile);
System.setProperty("javax.net.ssl.trustStorePassword",truststorePassword);

但是,问题是要作为clinet访问另外一个也是基于HTTPS的web services,当然证书是不一样的, 这时client能再次设置这些系统参数为另外的值么?访问能成功么?


原始帖子看这里: http://topic.csdn.net/u/20090713/10/112488bb-bf45-4f87-93f6-62961fc12ad5.html


我查看了资料并整理了一下,通过Socket可以进行,当然我个人认为httpclient等现成的组件也可以,不过我就不去尝试了,因为我许多时候更喜欢用自己封装的组件。


完整的代码如下:

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * JAVA操作SSL协议,通过Socket访问Https的程序代码例子。 * * @author JAVA世纪网(java2000.net) * */ public class ReadHttpsURL { // 默认的HTTPS 端口 static final int HTTPS_PORT = 443; public static void main(String argv[]) throws Exception { // 受访主机 String host = "www.google.com"; // 受访的页面 String url = "/adsense/?sourceid=aso&subid=ZH_CN-ET-AS-ADSBY6&medium=link&hl=zh_CN"; // 自定义的管理器 X509TrustManager xtm = new Java2000TrustManager(); TrustManager mytm[] = { xtm }; // 得到上下文 SSLContext ctx = SSLContext.getInstance("SSL"); // 初始化 ctx.init(null, mytm, null); // 获得工厂 SSLSocketFactory factory = ctx.getSocketFactory(); // 从工厂获得Socket连接 Socket socket = factory.createSocket(host, HTTPS_PORT); // 剩下的就和普通的Socket操作一样了 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.write("GET " + url + " HTTP/1.0/n/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()); } } /** * 自定义的认证管理类。 * * @author JAVA世纪网(java2000.net) * */ class Java2000TrustManager implements X509TrustManager { Java2000TrustManager() { // 这里可以进行证书的初始化操作 } // 检查客户端的可信任状态 public void checkClientTrusted(X509Certificate chain[], String authType) throws CertificateException { System.out.println("检查客户端的可信任状态..."); } // 检查服务器的可信任状态 public void checkServerTrusted(X509Certificate chain[], String authType) throws CertificateException { System.out.println("检查服务器的可信任状态"); } // 返回接受的发行商数组 public X509Certificate[] getAcceptedIssuers() { System.out.println("获取接受的发行商数组..."); return null; } }

你可能感兴趣的:(java,exception,socket,String,ssl,null)