创建带证书的安全连接HttpsURLConnection
public HttpsURLConnection createSSLConnection(String reqUrl, String reqBody, String pwd,String path) throws Exception{
URL url = new URL(reqUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Length", reqBody.length() + "");
conn.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
try {
SSLSocketFactory sslSocketFactory = initCert(pwd,path);
conn.setSSLSocketFactory(sslSocketFactory);
}catch (Exception e){
throw new Exception("证书加载错误");
}
String encode = "utf-8";
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), encode);
out.write(reqBody.toString());
out.flush();
out.close();
return conn;
}
private SSLSocketFactory initCert(String pwd, String path) throws Exception {
FileInputStream instream = null;
try {
instream = new FileInputStream(new File(path));
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(instream, pwd.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(ks, pwd.toCharArray());
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { }
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { }
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{tm}, null);
return sslContext.getSocketFactory();
}catch(Exception e){
e.printStackTrace();
throw new Exception(e.getMessage());
}finally {
if(instream != null){
try{instream.close();}catch (IOException e1){e1.printStackTrace();}
}
}
}