commons-httpclient SSL: 클라이언트 인증 버전 코드

중간에 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();
}
}


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://www.xeraph.com/tb/5278868 [도움말]

덧글

댓글 입력 영역