在网上找了好多例子,但是都没有我想要的。我的要求是,程序可以自动完成证书导入然后与服务器交换数据。
网上的例子是可以工作的,前提是要访问的网站的证书已经导入到本机。但是作为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); } }