`
wecbk
  • 浏览: 32542 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

无视Https证书是否正确的Java Http Client

 
阅读更多
需要保证通讯的端到端安全,大家一致认为Https方式最适合,但需要评估性能代价。

采取ajp connector貌似无法直接使用httpd2进行load balance了,而且proxy模式的性能实在是让人心寒;jk connector如果tomcat不配ssl,据说需要forward一下,还没有搞定。

为了测试性能,写了个可以无视Https证书是否正确都能连接的Java Http Client。以为很简单的一段代码,绕是迈过了两个小门槛,才搞定的。code可以拿出来晒一晒了。

运行环境jdk1.6,不需要其它类库。

package test;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
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.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

   /**
     * 无视Https证书是否正确的Java Http Client
     *
     * <p>
     * <a href="HttpsUtil.java.html"><i>View Source</i></a>
     * </p>
     *
     * @author <a href="mailto:twotwo.li@gmail.com">LiYan</a>
     *
     * @create Sep 10, 2009 9:59:35 PM
     * @version $Id$
     */
public class HttpsUtil {

    /**
     * 忽视证书HostName
     */
    private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
        public boolean verify(String s, SSLSession sslsession) {
            System.out.println("WARNING: Hostname is not matched for cert.");
            return true;
        }
    };

     /**
     * Ignore Certification
     */
    private static TrustManager ignoreCertificationTrustManger = new X509TrustManager() {

        private X509Certificate[] certificates;

        @Override
        public void checkClientTrusted(X509Certificate certificates[],
                String authType) throws CertificateException {
            if (this.certificates == null) {
                this.certificates = certificates;
                System.out.println("init at checkClientTrusted");
            }

        }

        @Override
        public void checkServerTrusted(X509Certificate[] ax509certificate,
                String s) throws CertificateException {
            if (this.certificates == null) {
                this.certificates = ax509certificate;
                System.out.println("init at checkServerTrusted");
            }

//            for (int c = 0; c < certificates.length; c++) {
//                X509Certificate cert = certificates[c];
//                System.out.println(" Server certificate " + (c + 1) + ":");
//                System.out.println("  Subject DN: " + cert.getSubjectDN());
//                System.out.println("  Signature Algorithm: "
//                        + cert.getSigAlgName());
//                System.out.println("  Valid from: " + cert.getNotBefore());
//                System.out.println("  Valid until: " + cert.getNotAfter());
//                System.out.println("  Issuer: " + cert.getIssuerDN());
//            }

        }

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

    };

    public static byte[] doGet(String urlString) {

        ByteArrayOutputStream buffer = new ByteArrayOutputStream(512);
        try {

            URL url = new URL(urlString);

            /*
             * use ignore host name verifier
             */
            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
            HttpsURLConnection connection = (HttpsURLConnection) url
                    .openConnection();

            // Prepare SSL Context
            TrustManager[] tm = { ignoreCertificationTrustManger };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());

            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            connection.setSSLSocketFactory(ssf);
           
            InputStream reader = connection.getInputStream();
            byte[] bytes = new byte[512];
            int length = reader.read(bytes);

            do {
                buffer.write(bytes, 0, length);
                length = reader.read(bytes);
            } while (length > 0);

            // result.setResponseData(bytes);
            System.out.println(buffer.toString());
            reader.close();
           
            connection.disconnect();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
        }
        return buffer.toByteArray();
    }

    public static void main(String[] args) {
        String urlString = "https://www.google.com/adsense/";
        String output = new String(HttpsUtil.getMethod(urlString));
        System.out.println(output);
    }
}
分享到:
评论

相关推荐

    JavaClient.java

    JavaClient.java JavaClient.java JavaClient.java

    java-rtsp-client.rar_RTSP JAVA_java rtsp client_rtsp_rtsp client

    文件"java rtsp client.doc"可能是关于如何在Java中构建RTSP客户端的详细指南,涵盖以下内容: 1. **设置环境**:安装必要的库,配置开发环境。 2. **RTSP协议理解**:解释RTSP的基本概念和命令。 3. **代码示例**:...

    java-client.jar

    opentsdb-java-client-master.zip ,java-client.jar

    syslog-java-client-1.0.1.zip

    《Syslog-Java-Client:一个开源的Java syslog客户端实现》 Syslog,全称System Logging Protocol,是一种广泛用于网络设备、操作系统以及应用程序的日志记录协议。它允许系统管理员集中收集和管理分布在不同设备...

    把Https网站中的安全证书导入到java的cacerts证书库中

    当Java应用尝试连接一个HTTPS站点时,它会检查服务器提供的证书是否由 cacerts 中的一个CA签名。 3. **SSL/TLS协议**:SSL(Secure Socket Layer)和TLS(Transport Layer Security)是用于加密网络通信的协议,...

    java http post client server

    标签“java http post client server”暗示了我们要关注HTTP协议的POST方法。POST方法用于向服务器提交数据,常用于表单提交或发送JSON数据。在Java中,我们通常会把数据序列化成字符串,然后通过`setDoOutput`和`...

    tensorflow serving java client

    标题中的 "tensorflow serving java client" 指的是专门为 Java 开发的 TensorFlow Serving 客户端库。这个客户端库使得 Java 开发者能够方便地构建应用,调用在 TensorFlow Serving 上部署的模型进行预测。 描述中...

    java-client-4&5

    在本案例中,我们关注的是两个特定的Java客户端版本:`java-client-4.1.2`和`java-client-5`。这两个版本的发布针对不同的需求和环境,特别是对于那些寻求稳定性和兼容性的项目,旧版本如`4.1.2`可能更受欢迎。 `...

    JIRA REST Java Client

    **JIRA REST Java Client**是Atlassian官方提供的一款用于与JIRA进行交互的Java库,它使得开发人员能够轻松地通过RESTful API访问和操作JIRA系统。这个库提供了丰富的功能,包括创建、更新、查询问题(issues)、...

    httpclient 绕开HTTPS证书校验

    在默认情况下,`httpclient`会使用系统提供的`TrustManager`,这会严格检查服务器证书链是否可信任。但是,我们可以通过创建一个信任所有证书的`TrustManager`实例,然后将其设置到`SSLContext`中,从而跳过证书验证...

    java client访问https server(客户端代码、服务器端配置)

    - `cfcakeystore_client.jks`, `cfcakeystore_server.jks`: JKS文件,Java密钥库,分别包含客户端和服务器的证书和私钥。 - `cfca_server.key`: 可能是服务器的私钥文件,不包含证书。 - `cfca_server.p12`: PKCS...

    Simplified Java RTSP Client

    A simplified java rtsp client source code

    java-client-6.0.0-BETA4

    java-client-6.0.0-BETA4 服务器端

    gerrit-rest-java-client, Gerrit代码审查的Java REST客户端.zip

    gerrit-rest-java-client, Gerrit代码审查的Java REST客户端 gerrit-rest-java-client 简介Gerrit代码审查工具 REST API的Java实现。仅支持 Gerrit 2.6或者更新版本的( 。旧版本中缺少/不完整的REST API ) 。

    java smartclient实例

    Java SmartClient是一个强大的富客户端应用开发框架,它允许开发者创建高度交互、响应迅速的Web应用程序,无需深厚的JavaScript技能。在本实例中,我们将探讨如何利用Java SmartClient进行基础的开发工作,以及如何...

    appium java-client-5.0.4.jar包

    《Appium Java-client-5.0.4.jar在Android Studio中的自动化测试应用》 Appium Java-client-5.0.4.jar是针对Appium自动化测试框架的一个重要组件,主要用于Java编程环境下的移动应用自动化测试。Appium本身是一个...

    java-client5.0.4和selenium-java-3 jar包

    Java客户端库`java-client-5.0.4`和Selenium Java绑定`selenium-java-3`是自动化测试领域中广泛使用的工具,特别是针对移动应用(Appium)和Web应用程序的测试。这两个jar包分别提供了与Appium服务器和Selenium ...

    selenium-java-client

    `selenium-java-client-driver-1.0.2.jar` 是一个专门用于Java编程语言的Selenium客户端驱动程序,它使得开发者能够编写自动化脚本来操控网页浏览器,进行功能测试和性能测试。Selenium是一个强大的开源自动化测试...

    api-ntrip-java-client-master.zip_android_ntrip_ntrip java实现_ntr

    标题中的“api-ntrip-java-client-master.zip”是一个包含Java实现的NTRIP客户端的源代码压缩包,专门针对Android平台。NTRIP(Networked Transport of RTCM via Internet Protocol)是一种用于实时传输GPS(全球...

    appium java自动化jar包java-client

    里面有四个包java-client-3.1.0-sources,selenium-java-2.44.0,selenium-java-client-driver-1.0.2,selenium-server-standalone-2.53.0

Global site tag (gtag.js) - Google Analytics