在网上找了好多例子,但是都没有我想要的。我的要求是,程序可以自动完成证书导入然后与服务器交换数据。

网上的例子是可以工作的,前提是要访问的网站的证书已经导入到本机。但是作为java的访问一个未知的https网站,不可能都手动的导入进去,所以这些例子不太好,但是又没有找到合适的,有的也不能工作,我研究一下争取可以发一个可以傻瓜直接运行的例子。

 

下边这个例子是可以直接运行的,也是我这次任务所要完成的,至于具体的原理鄙人也不知,总之先比葫芦画瓢等随后在慢慢剖析。

 貌似对这样的可以通过的代码有点感觉就是,java有一个默认的cert checker是需要你本机有目标网站的证书,如果没有就会抛出异常,但是在我们这里,我们自己定义了一个cerrt checker去替换默认的,我们这里的实现也是对于检查什么都没做,所以这样的code对于任何的一个https网站都是可以通过的,这也貌似是code的简单原理。。

 

package test;

import java.net.URL;
import java.security.cert.Certificate;
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 HttpsTest {

    public static void main(String[] args) {
        new HttpsTest().doMain();
        log("DONE");
    }
    
    public void doMain() {
        String hsUrl = "https://localhost:8443/testApp/hel.jsp";
        hsUrl = "https://google.com";
        hsUrl = "https://vip1.icbc.com.cn/icbc/perbank/index.jsp";
        URL url ;
        
        try {
            url = new URL(hsUrl);
            HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
            
            X509TrustManager xtm = new X509TrustManager() {
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    // TODO Auto-generated method stub
                    return null;
                }
                
                @Override
                public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                        throws CertificateException {
                    // TODO Auto-generated method stub
                    
                }
                
                @Override
                public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                        throws CertificateException {
                    // TODO Auto-generated method stub
                    
                }
            };
            
            TrustManager[] tm = { xtm };
            
            SSLContext ctx = SSLContext.getInstance("TLS");
            ctx.init(null, tm, null);
            
            con.setSSLSocketFactory(ctx.getSocketFactory());
            con.setHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }
            });
            
            
            log(con.getResponseCode());
            log(con.getCipherSuite());
            log("");
            Certificate[] certs = con.getServerCertificates();
            
            int certNum = 1;
            
            for(Certificate cert : certs) {
                X509Certificate xcert = (X509Certificate) cert;
                log("Cert No. " + certNum ++);
                log(xcert.getType());
                log(xcert.getPublicKey().getAlgorithm());
                log(xcert.getIssuerDN());
                log(xcert.getIssuerDN());
                log(xcert.getNotAfter());
                log(xcert.getNotBefore());
                log("");
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    static void log(Object o) {
        System.out.println(o);
    }

}