1 package com.freemindcafe.socket.ssl.sample5;
4 import java.io.BufferedReader;
5 import java.io.FileInputStream;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.net.Socket;
9 import java.security.KeyStore;
10 import java.security.Principal;
11 import java.security.PrivateKey;
12 import java.security.cert.X509Certificate;
14 import javax.net.ssl.KeyManager;
15 import javax.net.ssl.KeyManagerFactory;
16 import javax.net.ssl.SSLContext;
17 import javax.net.ssl.SSLServerSocket;
18 import javax.net.ssl.SSLServerSocketFactory;
19 import javax.net.ssl.SSLSocket;
20 import javax.net.ssl.TrustManagerFactory;
21 import javax.net.ssl.X509KeyManager;
23 import org.junit.Test;
28 public void ssl_server_that_demands_client_auth_uses_custom_key_manager()
throws Exception{
31 "javax.net.ssl.trustStore",currentDir()+
"/src/com/freemindcafe/socket/ssl/sample5/serverkeystore.jks");
32 System.setProperty(
"javax.net.ssl.trustStorePassword",
"password");
38 System.setProperty(
"javax.net.debug",
"ssl:handshake");
40 KeyStore ks = KeyStore.getInstance(
"JKS");
43 char[] passphrase =
"password".toCharArray();
45 ks.load(
new FileInputStream(currentDir()+
"/src/com/freemindcafe/socket/ssl/sample5/serverkeystore.jks"), passphrase);
48 KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
49 kmf.init(ks, passphrase);
54 final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
55 X509KeyManager km =
new X509KeyManager() {
58 public String chooseClientAlias(String[] keyType,
59 Principal[] issuers, Socket socket) {
60 return origKm.chooseClientAlias(keyType, issuers, socket);
64 public String chooseServerAlias(String keyType,
65 Principal[] issuers, Socket socket) {
71 public X509Certificate[] getCertificateChain(String alias) {
72 return origKm.getCertificateChain(alias);
76 public String[] getClientAliases(String keyType, Principal[] issuers) {
77 return origKm.getClientAliases(keyType, issuers);
81 public PrivateKey getPrivateKey(String alias) {
82 return origKm.getPrivateKey(alias);
86 public String[] getServerAliases(String keyType, Principal[] issuers) {
87 return origKm.getServerAliases(keyType, issuers);
92 SSLContext sslContext = SSLContext.getInstance(
"TLSv1.2");
94 sslContext.init(
new KeyManager[] { km }, null, null);
98 SSLServerSocketFactory sslserversocketfactory = sslContext.getServerSocketFactory();
99 SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
100 .createServerSocket(9999);
101 sslserversocket.setNeedClientAuth(
true);
102 SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
104 InputStream inputstream = sslsocket.getInputStream();
105 InputStreamReader inputstreamreader =
new InputStreamReader(
107 BufferedReader bufferedreader =
new BufferedReader(
110 String
string = null;
111 while ((
string = bufferedreader.readLine()) != null) {
112 System.out.println(
"server printing ################");
113 System.out.println(
string);