关于证书的生成,请参考:双向认证,证书生成方法
方法一:数据以json的格式发送
public void testHttps(){
try {
String url ="https://localhost:8443/mips/QueryBasicInfo";
String json ="{\"TT1\":\"isen\",\"TT2\":\"02E18F\",\"T06\":\"32\"}";
testHttpsPost(url,json);
} catch (Exception e) {
e.printStackTrace();
}
}
private void testHttpsPost(String url,String json) {
finalString KEY_STORE_TYPE_BKS = "bks";//android用bks
finalString KEY_STORE_TYPE_KKS = "jks";//java用bks
finalString KEY_STORE_TYPE_P12 = "PKCS12";
finalString SCHEME_HTTPS = "https";
finalint HTTPS_PORT = 8444;
finalString KEY_STORE_CLIENT_PATH = "D:\\client.key.p12";
finalString KEY_STORE_TRUST_PATH = "D:\\client.jks";
finalString KEY_STORE_PASSWORD = "client1234";
finalString KEY_STORE_TRUST_PASSWORD = "client321";
KeyStorekeyStore;
KeyStoretrustStore;
try{
//服务器端需要验证的客户端证书
keyStore= KeyStore.getInstance(KEY_STORE_TYPE_P12);//KeyStore.getDefaultType()
//客户端信任的服务器端证书
trustStore= KeyStore.getInstance(KEY_STORE_TYPE_KKS);
FileInputStreamksIn = new FileInputStream(new File(KEY_STORE_CLIENT_PATH));
FileInputStreamtsIn = new FileInputStream(new File(KEY_STORE_TRUST_PATH));
try{
keyStore.load(ksIn,KEY_STORE_PASSWORD.toCharArray());
trustStore.load(tsIn,KEY_STORE_TRUST_PASSWORD.toCharArray());
}catch (Exception e) {
e.printStackTrace();
}finally {
try{
ksIn.close();
}catch (Exception ignore) {
}
try{
tsIn.close();
}catch (Exception ignore) {
}
}
SSLContextsslcontext = null;
try{
sslcontext= SSLContexts
.custom()
.loadKeyMaterial(keyStore,KEY_STORE_PASSWORD.toCharArray())
.loadTrustMaterial(trustStore, newTrustSelfSignedStrategy())
.build();
}catch (UnrecoverableKeyException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
SSLConnectionSocketFactorysslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] {"TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClienthttpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
StringAPPLICATION_JSON = "application/json";
String CONTENT_TYPE_TEXT_JSON = "text/json";
HttpPosthttpPost = new HttpPost(url);
// json =URLEncoder.encode(json, "UTF_8"); //如果需要转码,则取消注释
StringEntity se = new StringEntity(json);
se.setContentType(CONTENT_TYPE_TEXT_JSON);
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,APPLICATION_JSON));
httpPost.setEntity(se);
CloseableHttpResponse httpResponse =httpClient.execute(httpPost);
System.out.println(httpResponse.toString());
try{
HttpEntityentity = httpResponse.getEntity();
System.out.println("-------------------------------------");
System.out.println(httpResponse.getStatusLine());
System.out.println(EntityUtils.toString(entity));//EntityUtils.toString(entity, "utf-8
EntityUtils.consume(entity);
}catch (Exception e) {
//TODO: handle exception
e.printStackTrace();
}finally {
httpPost.releaseConnection();
httpResponse.close();
}
}catch (KeyManagementException e) {
e.printStackTrace();
}catch (KeyStoreException e) {
e.printStackTrace();
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
方法二:数据以http参数的格式发送
public void testHttps(){
Content content = null;
try {
String url ="https://localhost:8443/mips/QueryBasicInfo";
List<NameValuePair>params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("TT1","isen"));
params.add(newBasicNameValuePair("TT1", "02E18F"));
params.add(newBasicNameValuePair("TT3", "32"));
testHttpsPost(url,params);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("content:"+ content.asString());
}
private void testHttpsPost(String url,List<NameValuePair> params) {
final StringKEY_STORE_TYPE_BKS = "bks";//android用bks
final StringKEY_STORE_TYPE_KKS = "jks";//java用bks
final String KEY_STORE_TYPE_P12= "PKCS12";
final StringSCHEME_HTTPS = "https";
final int HTTPS_PORT =8444;
final StringKEY_STORE_CLIENT_PATH = "D:\\client.key.p12";
final StringKEY_STORE_TRUST_PATH = "D:\\client.jks";
final StringKEY_STORE_PASSWORD = "client1234";
final StringKEY_STORE_TRUST_PASSWORD = "client321";
KeyStore keyStore;
KeyStore trustStore;
try {
// 服务器端需要验证的客户端证书
keyStore =KeyStore.getInstance(KEY_STORE_TYPE_P12);//KeyStore.getDefaultType()
// 客户端信任的服务器端证书
trustStore =KeyStore.getInstance(KEY_STORE_TYPE_KKS);
FileInputStreamksIn = new FileInputStream(new File(KEY_STORE_CLIENT_PATH));
FileInputStreamtsIn = new FileInputStream(new File(KEY_STORE_TRUST_PATH));
try {
keyStore.load(ksIn,KEY_STORE_PASSWORD.toCharArray());
trustStore.load(tsIn,KEY_STORE_TRUST_PASSWORD.toCharArray());
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
ksIn.close();
}catch (Exception ignore) {
}
try {
tsIn.close();
}catch (Exception ignore) {
}
}
SSLContextsslcontext = null;
try {
sslcontext= SSLContexts
.custom()
.loadKeyMaterial(keyStore,KEY_STORE_PASSWORD.toCharArray())
.loadTrustMaterial(trustStore, newTrustSelfSignedStrategy())
.build();
} catch(UnrecoverableKeyException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
SSLConnectionSocketFactorysslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClienthttpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
HttpPosthttppost = new HttpPost(url);
httppost.setEntity(newUrlEncodedFormEntity(params));
CloseableHttpResponse httpResponse =httpClient.execute(httppost);
System.out.println(httpResponse.toString());
try {
HttpEntityentity = httpResponse.getEntity();
System.out.println("-------------------------------------");
System.out.println(httpResponse.getStatusLine());
System.out.println(EntityUtils.toString(entity));//EntityUtils.toString(entity, "utf-8
EntityUtils.consume(entity);
} catch(Exception e) {
//TODO: handle exception
e.printStackTrace();
} finally {
httppost.releaseConnection();
httpResponse.close();
}
} catch(KeyManagementException e) {
e.printStackTrace();
} catch(KeyStoreException e) {
e.printStackTrace();
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}