diff --git a/ahc/src/main/java/de/swingbe/ahc/CustomSSLSocketFactory.java b/ahc/src/main/java/de/swingbe/ahc/CustomSSLSocketFactory.java new file mode 100644 index 0000000..c673369 --- /dev/null +++ b/ahc/src/main/java/de/swingbe/ahc/CustomSSLSocketFactory.java @@ -0,0 +1,51 @@ +package de.swingbe.ahc; + +import org.apache.http.conn.ssl.SSLSocketFactory; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.IOException; +import java.net.Socket; +import java.net.UnknownHostException; +import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class CustomSSLSocketFactory extends SSLSocketFactory { + SSLContext sslContext = SSLContext.getInstance("TLS"); + + public CustomSSLSocketFactory(KeyStore truststore) throws + NoSuchAlgorithmException, KeyManagementException, + KeyStoreException, UnrecoverableKeyException { + super(truststore); + + TrustManager tm = new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] chain, + String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, + String authType) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + + sslContext.init(null, new TrustManager[]{tm}, null); + } + + @Override + public Socket createSocket(Socket socket, String host, int port, + boolean autoClose) throws IOException, UnknownHostException { + return sslContext.getSocketFactory().createSocket(socket, + host, port, autoClose); + } + + @Override + public Socket createSocket() throws IOException { + return sslContext.getSocketFactory().createSocket(); + } +} diff --git a/ahc/src/main/java/de/swingbe/ahc/Main.java b/ahc/src/main/java/de/swingbe/ahc/Main.java index 412df81..2994797 100644 --- a/ahc/src/main/java/de/swingbe/ahc/Main.java +++ b/ahc/src/main/java/de/swingbe/ahc/Main.java @@ -3,16 +3,32 @@ package de.swingbe.ahc; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.PlainSocketFactory; +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.ByteArrayEntity; +import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.message.BasicHeader; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.HTTP; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.cert.CertificateException; import java.util.Scanner; public class Main { @@ -23,10 +39,172 @@ public class Main { public static void main(String[] args) { System.out.println("Hello world!"); - post("uuid", 87.263783, 52.9019052, 0, "alias", "vehicle"); + postHttps("uuid", 87.263783, 52.9019052, + 1642512736, "alias", "0"); System.out.println("Done!"); } + static void postHttps(final String uuid, final double latitude, final double longitude, + final long timestamp, final String alias, final String vehicle) { + KeyStore trustStore = + null; + try { + trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + } catch (KeyStoreException e) { + e.printStackTrace(); + } + try { + trustStore.load(null, null); + } catch (IOException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (CertificateException e) { + e.printStackTrace(); + } + + SSLSocketFactory sf = null; + try { + sf = new CustomSSLSocketFactory(trustStore); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (KeyStoreException e) { + e.printStackTrace(); + } catch (UnrecoverableKeyException e) { + e.printStackTrace(); + } + sf.setHostnameVerifier( + SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + + HttpParams params = new BasicHttpParams(); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); + + SchemeRegistry registry = new SchemeRegistry(); + registry.register(new Scheme("http", + PlainSocketFactory.getSocketFactory(), 80)); + registry.register(new Scheme("https", sf, 443)); + + ClientConnectionManager ccm = + new ThreadSafeClientConnManager(params, registry); + + HttpClient client = new DefaultHttpClient(ccm, params); + + /**TODO + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("key1", "val1")); + nvps.add(new BasicNameValuePair("key2", "val3")); + */ + + String address = URL + ":" + PORT + ROUTE; + System.out.println("address: " + address); + + //create a HTTP POST request + //use web service endpoint or web site page as url + HttpPost post = + null; + try { + post = new HttpPost(new URI(address)); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + //set request headers for request data in JSON format + Header[] headers = { + new BasicHeader("Content-type", "application/json"), + }; + //the request payload is in JSON format + + //set request headers + post.setHeaders(headers); + + //create payload + //create request data in JSON format + //create JSON object + JSONObject payload = new JSONObject(); + try { + payload.put("uuid", uuid); + payload.put("latitude", latitude); + payload.put("longitude", longitude); + payload.put("timestamp", timestamp); + payload.put("alias", alias); + payload.put("vehicle", vehicle); + } catch (JSONException e) { + System.out.println("ERROR: JSON error detected"); + e.printStackTrace(); + } + + //set the payload + HttpEntity entity; + entity = new ByteArrayEntity(payload.toString().getBytes(StandardCharsets.UTF_8)); + post.setEntity(entity); + + /**TODO + try { + post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + */ + + //send request + HttpResponse response = null; + try { + response = client.execute(post); + } catch (IOException e) { + System.out.println("ERROR: IO error detected"); + e.printStackTrace(); + } + + + //read response status + Scanner sc = null; + if (response != null) { + try { + sc = new Scanner(response.getEntity().getContent()); + } catch (IOException e) { + System.out.println("ERROR: IO error detected"); + e.printStackTrace(); + } + } + + //print status line + if (response != null) { + System.out.println("status line: " + response.getStatusLine()); + } + if (sc != null) { + while (sc.hasNext()) { + System.out.println("status line: " + sc.nextLine()); + } + } + + //close interaction + try { + if (response != null) { + response.getEntity().getContent().close(); + } + } catch (IOException e) { + System.out.println("ERROR: IO error detected"); + e.printStackTrace(); + } + + //verify response + int responseCode = 0; + if (response != null) { + responseCode = response.getStatusLine().getStatusCode(); + System.out.println("responseCode: " + responseCode); + } + String statusPhrase = null; + if (response != null) { + statusPhrase = response.getStatusLine().getReasonPhrase(); + System.out.println("statusPhrase: " + statusPhrase); + } + + + } + static void post(final String uuid, final double latitude, final double longitude, final long timestamp, final String alias, final String vehicle) {