중간에 HttpsURLConnection으로 테스트한 부분 있으니 주석 풀고 그걸로 테스트해봐도 됨..
package org.krakenapps;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
public class DownloadTest {
class HttpsSocketFactory implements SecureProtocolSocketFactory, HandshakeCompletedListener {
private KeyManagerFactory kmf;
private TrustManagerFactory tmf;
public HttpsSocketFactory(KeyManagerFactory kmf, TrustManagerFactory tmf) {
this.kmf = kmf;
this.tmf = tmf;
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
UnknownHostException {
return createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort,
HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
return createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException,
UnknownHostException {
return createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
try {
KeyManager[] keyManagers = null;
if (kmf != null)
keyManagers = kmf.getKeyManagers();
TrustManager[] trustManagers = null;
if (tmf != null)
trustManagers = tmf.getTrustManagers();
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(keyManagers, trustManagers, new SecureRandom());
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket(host, port);
socket.setNeedClientAuth(true);
socket.setEnabledCipherSuites(socket.getSupportedCipherSuites());
socket.addHandshakeCompletedListener(this);
return socket;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return null;
}
@Override
public void handshakeCompleted(HandshakeCompletedEvent event) {
System.out.println("handshake completed");
try {
System.out.println("CipherSuite: " + event.getCipherSuite());
SSLSession session = event.getSession();
System.out.println("Protocol: " + session.getProtocol());
System.out.println("PeerHost: " + session.getPeerHost());
java.security.cert.Certificate[] certs = event.getPeerCertificates();
for (int i = 0; i < certs.length; i++) {
if (!(certs[i] instanceof java.security.cert.X509Certificate))
continue;
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) certs[i];
System.out.println("Cert #" + i + ": " + cert.getSubjectDN().getName());
}
} catch (Exception e) {
System.out.println("handshake completed: " + e);
}
}
}
public void run() throws HttpException, IOException, NoSuchAlgorithmException, CertificateException,
KeyStoreException, UnrecoverableKeyException, KeyManagementException {
System.setProperty("javax.net.debug", "all");
char[] password = "PASSWORD".toCharArray();
FileInputStream is = new FileInputStream("server.pfx");
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(is, password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keystore, password);
KeyStore truststore = KeyStore.getInstance("JKS");
FileInputStream stream = new FileInputStream("apps.jks");
truststore.load(stream, password);
stream.close();
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(truststore);
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
// URL u = new URL("https://krakenapps.org/mvn/com/inspector/test.txt");
// HttpsURLConnection conn = (HttpsURLConnection) u.openConnection();
// conn.setSSLSocketFactory(ctx.getSocketFactory());
// BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// String line;
// final StringBuilder sb = new StringBuilder();
// while (null != (line = in.readLine())) {
// sb.append(line).append("\n");
// }
//
// System.out.println(sb.toString());
HttpsSocketFactory h = new HttpsSocketFactory(kmf, tmf);
Protocol https = new Protocol("https", (ProtocolSocketFactory) h, 443);
Protocol.registerProtocol("https", https);
String url = "https://krakenapps.org/mvn/com/inspector/test.txt";
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url.toString());
int statusCode = client.executeMethod(method);
System.out.println(statusCode);
System.out.println("================================");
byte[] b = method.getResponseBody();
System.out.println("!!!" + b.length + " = " + new String(b));
System.out.println("================================");
}
public static void main(String[] args) throws HttpException, IOException, UnrecoverableKeyException,
NoSuchAlgorithmException, CertificateException, KeyStoreException, KeyManagementException {
new DownloadTest().run();
}
}




덧글