package com.casic.missiles.util;
import com.casic.missiles.config.properties.CasicProperties;
import com.casic.missiles.core.util.SpringContextHolder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
//import org.apache.http.entity.mime.MultipartEntityBuilder;
//import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.KeyStore;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@SuppressWarnings("deprecation")
public class HttpsUtil extends DefaultHttpClient {
public final static String HTTPGET = "GET";
public final static String HTTPPUT = "PUT";
public final static String HTTPPOST = "POST";
public final static String HTTPDELETE = "DELETE";
public final static String HTTPACCEPT = "Accept";
public final static String CONTENT_LENGTH = "Content-Length";
public final static String CHARSET_UTF8 = "UTF-8";
private static HttpClient httpClient;
//Paths of certificates.
public static String SELFCERTPATH = "cert/outgoing.CertwithKey.pkcs12";
public static String TRUSTCAPATH = "cert/ca.jks";
//Password of certificates.
public static String SELFCERTPWD = "IoM@1234";
public static String TRUSTCAPWD = "Huawei@123";
/**
* Two-Way Authentication In the two-way authentication, the client needs: 1
* Import your own certificate for server verification; 2 Import the CA
* certificate of the server, and use the CA certificate to verify the
* certificate sent by the server; 3 Set the domain name to not verify
* (Non-commercial IoT platform, no use domain name access.)
* */
public void initSSLConfigForTwoWay() throws Exception {
//读取配置文件里绝对路径
CasicProperties gunsProperties = SpringContextHolder.getBean(CasicProperties.class);
String demo_base_Path = gunsProperties.getFileUploadPath();
// 1 Import your own certificate
String selfcertpath = demo_base_Path + SELFCERTPATH;
String trustcapath = demo_base_Path + TRUSTCAPATH;
System.out.println("==============");
System.out.println(selfcertpath);
System.out.println(trustcapath);
KeyStore selfCert = KeyStore.getInstance("pkcs12");
//调试文件路径代码
File testFile = new File(selfcertpath);
if(!testFile .exists()) {
System.out.println("https验证文件不存在");
}
selfCert.load(new FileInputStream(selfcertpath), SELFCERTPWD.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(selfCert, SELFCERTPWD.toCharArray());
// 2 Import the CA certificate of the server,
KeyStore caCert = KeyStore.getInstance("jks");
caCert.load(new FileInputStream(trustcapath), TRUSTCAPWD.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
tmf.init(caCert);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// 3 Set the domain name to not verify
// (Non-commercial IoT platform, no use domain name access generally.)
SSLSocketFactory ssf = new SSLSocketFactory(sc, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
// If the platform has already applied for a domain name which matches
// the domain name in the certificate information, the certificate
// domain name check can be enabled (open by default)
// SSLSocketFactory ssf = new SSLSocketFactory(sc);
ClientConnectionManager ccm = this.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 8743, ssf));
httpClient = new DefaultHttpClient(ccm);
}
/**
* One-Way Authentication In the One-way authentication, the client needs: 1
* Import the CA certificate of the server, and use the CA certificate to
* verify the certificate sent by the server; 2 Set the domain name to not
* verify (Non-commercial IoT platform, no use domain name access.)
* */
/*
* public void initSSLConfigForOneWay() throws Exception {
*
* // 1 Import the CA certificate of the server, KeyStore caCert =
* KeyStore.getInstance("jks"); caCert.load(new
* FileInputStream(TRUSTCAPATH), TRUSTCAPWD.toCharArray());
* TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
* tmf.init(caCert);
*
* SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null,
* tmf.getTrustManagers(), null);
*
* // 2 Set the domain name to not verify // (Non-commercial IoT platform,
* no use domain name access generally.) SSLSocketFactory ssf = new
* SSLSocketFactory(sc, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
*
* //If the platform has already applied for a domain name which matches the
* domain name in the certificate information, the certificate //domain name
* check can be enabled (open by default) // SSLSocketFactory ssf = new
* SSLSocketFactory(sc);
*
* ClientConnectionManager ccm = this.getConnectionManager(); SchemeRegistry
* sr = ccm.getSchemeRegistry(); sr.register(new Scheme("https", 8743,
* ssf));
*
* httpClient = new DefaultHttpClient(ccm); }
*/
public HttpResponse doPostJson(String url, Map<String, String> headerMap,
String content) {
HttpPost request = new HttpPost(url);
addRequestHeader(request, headerMap);
request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
return executeHttpRequest(request);
}
public StreamClosedHttpResponse doPostMultipartFile(String url, Map<String, String> headerMap, File file) {
HttpPost request = new HttpPost(url);
addRequestHeader(request, headerMap);
// FileBody fileBody = new FileBody(file);
// // Content-Type:multipart/form-data; boundary=----WebKitFormBoundarypJTQXMOZ3dLEzJ4b
// HttpEntity reqEntity = (HttpEntity) MultipartEntityBuilder.create().addPart("file", fileBody).build();
// request.setEntity(reqEntity);
return (StreamClosedHttpResponse) executeHttpRequest(request);
}
public StreamClosedHttpResponse doPostJsonGetStatusLine(String url, Map<String, String> headerMap, String content) {
HttpPost request = new HttpPost(url);
addRequestHeader(request, headerMap);
request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
HttpResponse response = executeHttpRequest(request);
if (null == response) {
System.out.println("The response body is null.");
}
return (StreamClosedHttpResponse) response;
}
public StreamClosedHttpResponse doPostJsonGetStatusLine(String url, String content) {
HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
HttpResponse response = executeHttpRequest(request);
if (null == response) {
System.out.println("The response body is null.");
}
return (StreamClosedHttpResponse) response;
}
private List<NameValuePair> paramsConverter(Map<String, String> params) {
List<NameValuePair> nvps = new LinkedList<NameValuePair>();
Set<Map.Entry<String, String>> paramsSet = params.entrySet();
for (Map.Entry<String, String> paramEntry : paramsSet) {
nvps.add(new BasicNameValuePair(paramEntry.getKey(), paramEntry.getValue()));
}
return nvps;
}
public StreamClosedHttpResponse doPostFormUrlEncodedGetStatusLine(String url, Map<String, String> formParams) throws Exception {
HttpPost request = new HttpPost(url);
request.setEntity(new UrlEncodedFormEntity(paramsConverter(formParams)));
HttpResponse response = executeHttpRequest(request);
if (null == response) {
System.out.println("The response body is null.");
throw new Exception();
}
return (StreamClosedHttpResponse) response;
}
public HttpResponse doPutJson(String url, Map<String, String> headerMap,
String content) {
HttpPut request = new HttpPut(url);
addRequestHeader(request, headerMap);
request.setEntity(new StringEntity(content, ContentType.APPLICATION_JSON));
return executeHttpRequest(request);
}
public HttpResponse doPut(String url, Map<String, String> headerMap) {
HttpPut request = new HttpPut(url);
addRequestHeader(request, headerMap);
return executeHttpRequest(request);
}
public StreamClosedHttpResponse doPutJsonGetStatusLine(String url, Map<String, String> headerMap, String content) {
HttpResponse response = doPutJson(url, headerMap, content);
if (null == response) {
System.out.println("The response body is null.");
}
return (StreamClosedHttpResponse) response;
}
public StreamClosedHttpResponse doPutGetStatusLine(String url, Map<String, String> headerMap) {
HttpResponse response = doPut(url, headerMap);
if (null == response) {
System.out.println("The response body is null.");
}
return (StreamClosedHttpResponse) response;
}
public HttpResponse doGetWithParas(String url,
Map<String, String> queryParams, Map<String, String> headerMap)
throws Exception {
HttpGet request = new HttpGet();
addRequestHeader(request, headerMap);
URIBuilder builder;
try {
builder = new URIBuilder(url);
} catch (URISyntaxException e) {
System.out.printf("URISyntaxException: {}", e);
throw new Exception(e);
}
if (queryParams != null && !queryParams.isEmpty()) {
builder.setParameters(paramsConverter(queryParams));
}
request.setURI(builder.build());
return executeHttpRequest(request);
}
public StreamClosedHttpResponse doGetWithParasGetStatusLine(String url,
Map<String, String> queryParams, Map<String, String> headerMap)
throws Exception {
HttpResponse response = doGetWithParas(url, queryParams, headerMap);
if (null == response) {
System.out.println("The response body is null.");
}
return (StreamClosedHttpResponse) response;
}
public HttpResponse doDelete(String url, Map<String, String> headerMap) {
HttpDelete request = new HttpDelete(url);
addRequestHeader(request, headerMap);
return executeHttpRequest(request);
}
public StreamClosedHttpResponse doDeleteGetStatusLine(String url,
Map<String, String> headerMap) {
HttpResponse response = doDelete(url, headerMap);
if (null == response) {
System.out.println("The response body is null.");
}
return (StreamClosedHttpResponse) response;
}
private static void addRequestHeader(HttpUriRequest request,
Map<String, String> headerMap) {
if (headerMap == null) {
return;
}
for (String headerName : headerMap.keySet()) {
if (CONTENT_LENGTH.equalsIgnoreCase(headerName)) {
continue;
}
String headerValue = headerMap.get(headerName);
request.addHeader(headerName, headerValue);
}
}
private HttpResponse executeHttpRequest(HttpUriRequest request) {
HttpResponse response = null;
try {
response = httpClient.execute(request);
} catch (Exception e) {
System.out.println("executeHttpRequest failed.");
} finally {
try {
response = new StreamClosedHttpResponse(response);
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
}
}
return response;
}
public String getHttpResponseBody(HttpResponse response)
throws UnsupportedOperationException, IOException {
if (response == null) {
return null;
}
String body = null;
if (response instanceof StreamClosedHttpResponse) {
body = ((StreamClosedHttpResponse) response).getContent();
} else {
HttpEntity entity = response.getEntity();
if (entity != null && entity.isStreaming()) {
String encoding = entity.getContentEncoding() != null ? entity
.getContentEncoding().getValue() : null;
body = StreamUtil.inputStream2String(entity.getContent(),
encoding);
}
}
return body;
}
}