Initial Contribution

Signed-off-by: Vinay Vishal <vinay.vishal@oracle.com>
diff --git a/appserver/tests/appserv-tests/devtests/security/web-mutual-ssl/WebSSLClient.java b/appserver/tests/appserv-tests/devtests/security/web-mutual-ssl/WebSSLClient.java
new file mode 100644
index 0000000..bb4f565
--- /dev/null
+++ b/appserver/tests/appserv-tests/devtests/security/web-mutual-ssl/WebSSLClient.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package devtests.security;
+
+import java.io.*;
+import java.security.*;
+import java.net.*;
+import javax.net.ssl.*;
+import com.sun.ejte.ccl.reporter.*;
+
+/*
+   This is the standalone client java program to access AS web app
+   which has <security-constraint> protected by (in its web.xml)
+   <login-config>
+     <auth-method>CLIENT-CERT</auth-method>
+     <realm-name>default</realm-name>
+   </login-config>
+*/
+public class WebSSLClient {
+
+    private static final String TEST_NAME
+        = "security-web-mutual-ssl";    
+
+    private static final String EXPECTED_RESPONSE
+        = "[Ljava.security.cert.X509Certificate;";
+
+    private static SimpleReporterAdapter stat
+        = new SimpleReporterAdapter("appserv-tests");
+
+
+    public static void main(String args[]) throws Exception{
+
+        String host = args[0];
+        String port = args[1];
+        String contextRoot = args[2];
+        String keyStorePath = args[3];
+        String trustStorePath = args[4];
+        String sslPassword = args[5];
+
+        System.out.println("host/port=" + host + "/" + port);
+        
+        try {
+            stat.addDescription(TEST_NAME);
+            SSLSocketFactory ssf = getSSLSocketFactory(sslPassword,
+                                                       keyStorePath,
+                                                       trustStorePath);
+            HttpsURLConnection connection = connect("https://" + host  + ":"
+                                                    + port + contextRoot
+                                                    + "/TestClientCert",
+                                                    ssf);
+            
+            parseResponse(connection);
+            
+        } catch (Throwable t) {
+            stat.addStatus(TEST_NAME, stat.FAIL);
+            t.printStackTrace();
+        }
+        stat.printSummary(TEST_NAME);
+    }
+
+
+    private static void parseResponse(HttpsURLConnection connection)
+            throws Exception {
+
+        BufferedReader in = null;
+
+        try {
+            in = new BufferedReader(new InputStreamReader(
+                            connection.getInputStream()));
+            
+            String line = null;
+            while ((line = in.readLine()) != null) {
+                if (EXPECTED_RESPONSE.equals(line)) {
+                    stat.addStatus(TEST_NAME, stat.PASS);
+                    break;
+                }
+            }
+
+            if (line == null) {
+                System.err.println("Wrong response. Expected: "
+                                   + EXPECTED_RESPONSE
+                                   + ", received: " + line);
+                stat.addStatus(TEST_NAME, stat.FAIL);
+            }
+        } finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+
+
+    private static SSLSocketFactory getSSLSocketFactory(String sslPassword,
+                                                        String keyStorePath,
+                                                        String trustStorePath)
+            throws Exception {
+
+        SSLContext ctx = SSLContext.getInstance("TLS");
+
+        // Keystore 
+        KeyStore ks = KeyStore.getInstance("JKS");
+        char[] passphrase = sslPassword.toCharArray();
+        ks.load(new FileInputStream(keyStorePath), passphrase);
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+        kmf.init(ks, passphrase);
+
+        // Truststore
+        KeyStore trustStore = KeyStore.getInstance("JKS");
+        trustStore.load(new FileInputStream(trustStorePath), null);
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+        tmf.init(trustStore);
+
+        ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(), null);
+        
+        return ctx.getSocketFactory();
+    }
+
+
+    private static HttpsURLConnection connect(String urlAddress,
+                                              SSLSocketFactory ssf)
+            throws Exception {
+
+        URL url = new URL(urlAddress);
+        HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
+        HttpsURLConnection connection = (HttpsURLConnection)
+            url.openConnection();
+
+        connection.setHostnameVerifier(
+            new HostnameVerifier() {
+                public boolean verify(String rserver, SSLSession sses) {
+                    return true;
+                }
+        });
+
+        connection.setDoOutput(true);
+
+        return connection;
+    }
+}