package org.bouncycastle.jsse.provider.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.SecureRandom;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider;
/**
* A simple test designed to conduct a TLS handshake with an external TLS server,
* using the BC and BCJSSE providers.
*/
public class BCJSSEClientTest
{
public static void main(String[] args)
throws Exception
{
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(), 1);
Security.removeProvider(BouncyCastleJsseProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleJsseProvider(), 2);
/*
* TEST CODE ONLY. If writing your own code based on this test case, you should configure
* your trust manager(s) using a proper TrustManagerFactory, or else the server will be
* completely unauthenticated.
*/
TrustManager tm = new X509TrustManager()
{
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[0];
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
{
if (chain == null || chain.length < 1 || authType == null || authType.length() < 1)
{
throw new IllegalArgumentException();
}
String subject = chain[0].getSubjectX500Principal().getName();
System.out.println("Auto-trusted server certificate chain for: " + subject);
}
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException
{
}
};
SSLContext sslContext = SSLContext.getInstance("TLSv1.2", BouncyCastleJsseProvider.PROVIDER_NAME);
sslContext.init(null, new TrustManager[]{ tm }, new SecureRandom());
String host = "localhost";
int port = 8443;
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
SSLSocket sslSocket = (SSLSocket)sslSocketFactory.createSocket(host, port);
OutputStream output = sslSocket.getOutputStream();
writeUTF8Line(output, "GET / HTTP/1.1");
writeUTF8Line(output, "Host: " + host + ":" + port);
writeUTF8Line(output, "");
output.flush();
System.out.println("---");
InputStream input = sslSocket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line;
while ((line = reader.readLine()) != null)
{
System.out.println("<<< " + line);
/*
* TEST CODE ONLY. This is not a robust way of parsing the result!
*/
if (line.toUpperCase().contains("</HTML>"))
{
break;
}
}
System.out.flush();
sslSocket.close();
}
private static void writeUTF8Line(OutputStream output, String line)
throws IOException
{
output.write((line + "\r\n").getBytes("UTF-8"));
System.out.println(">>> " + line);
}
}