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