项目原因,代码实现证书控制,网上很多介绍使用System.setProt。。。等方法,后突然想到应该会有多线程安全问题,应为我方系统可能多个证书,故在iteye咨询大牛帮忙,详细见:
http://www.iteye.com/problems/94392
后按照一个那个朋友介绍,使用代码读取文件方式加载ssl,详细见:
SSLContext ctx = httpsMap.get(prjcodVal.getCPDPRJCOD().toUpperCase()); if(ctx == null){ //SSL设置,使用文件方式,如果使用system赋值方式会有多线程问题 ctx = SSLContext.getInstance("SSL"); KeyManagerFactory kmf = KeyManagerFactory .getInstance("SunX509"); TrustManagerFactory tmf = TrustManagerFactory .getInstance("SunX509"); KeyStore ks = KeyStore.getInstance("JKS"); KeyStore tks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(Constants .getConstants().getStrCertFilePath() + prjcodVal.getCPDPRJCOD().toUpperCase() + ".jks"), Constants.getConstants().getStrHTTPSCERPWD().toCharArray()); tks.load(new FileInputStream(Constants .getConstants().getStrCertFilePath() + prjcodVal.getCPDPRJCOD().toUpperCase() + ".jks"), Constants.getConstants().getStrHTTPSCERPWD().toCharArray()); kmf.init(ks, Constants.getConstants().getStrHTTPSCERPWD().toCharArray()); tmf.init(tks); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); httpsMap.put(prjcodVal.getCPDPRJCOD().toUpperCase(), ctx); } ((HttpsURLConnection)httpUrlConnection).setSSLSocketFactory(ctx.getSocketFactory()); ((HttpsURLConnection) httpUrlConnection) .setHostnameVerifier(new HostnameVerifier() { //让JRE相信所有的证书和对系统的域名和证书域名 public boolean verify(String urlHostName, SSLSession session) { return true; } });
读取之前从静态属性map中读取一下,如果不存在,则获取,然后放入map中,这样也可以提高效率。