1 //
2 // ========================================================================
3 // Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.util.ssl;
20
21 import java.net.Socket;
22 import java.security.Principal;
23 import java.security.PrivateKey;
24 import java.security.cert.X509Certificate;
25
26 import javax.net.ssl.SSLEngine;
27 import javax.net.ssl.X509ExtendedKeyManager;
28
29
30 /* ------------------------------------------------------------ */
31 /**
32 * KeyManager to select a key with desired alias
33 * while delegating processing to specified KeyManager
34 * Can be used both with server and client sockets
35 */
36 public class AliasedX509ExtendedKeyManager extends X509ExtendedKeyManager
37 {
38 private final String _alias;
39 private final X509ExtendedKeyManager _delegate;
40
41 /* ------------------------------------------------------------ */
42 /**
43 * Construct KeyManager instance
44 * @param keyAlias Alias of the key to be selected
45 * @param keyManager Instance of KeyManager to be wrapped
46 * @throws Exception if unable to create X509ExtendedKeyManager
47 */
48 public AliasedX509ExtendedKeyManager(X509ExtendedKeyManager keyManager, String keyAlias) throws Exception
49 {
50 _alias = keyAlias;
51 _delegate = keyManager;
52 }
53
54 /* ------------------------------------------------------------ */
55 public X509ExtendedKeyManager getDelegate()
56 {
57 return _delegate;
58 }
59
60 /* ------------------------------------------------------------ */
61 /**
62 * @see javax.net.ssl.X509KeyManager#chooseClientAlias(java.lang.String[], java.security.Principal[], java.net.Socket)
63 */
64 public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket)
65 {
66 if (_alias==null)
67 return _delegate.chooseClientAlias(keyType,issuers,socket);
68
69 for (String kt : keyType)
70 {
71 String[] aliases = _delegate.getClientAliases(kt,issuers);
72 if (aliases!=null)
73 {
74 for (String a:aliases)
75 if (_alias.equals(a))
76 return _alias;
77 }
78 }
79
80 return null;
81 }
82
83 /* ------------------------------------------------------------ */
84 /**
85 * @see javax.net.ssl.X509KeyManager#chooseServerAlias(java.lang.String, java.security.Principal[], java.net.Socket)
86 */
87 public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket)
88 {
89 if (_alias==null)
90 return _delegate.chooseServerAlias(keyType,issuers,socket);
91
92 String[] aliases = _delegate.getServerAliases(keyType,issuers);
93 if (aliases!=null)
94 {
95 for (String a:aliases)
96 if (_alias.equals(a))
97 return _alias;
98 }
99
100 return null;
101 }
102
103 /* ------------------------------------------------------------ */
104 /**
105 * @see javax.net.ssl.X509KeyManager#getClientAliases(java.lang.String, java.security.Principal[])
106 */
107 public String[] getClientAliases(String keyType, Principal[] issuers)
108 {
109 return _delegate.getClientAliases(keyType, issuers);
110 }
111
112
113 /* ------------------------------------------------------------ */
114 /**
115 * @see javax.net.ssl.X509KeyManager#getServerAliases(java.lang.String, java.security.Principal[])
116 */
117 public String[] getServerAliases(String keyType, Principal[] issuers)
118 {
119 return _delegate.getServerAliases(keyType, issuers);
120 }
121
122 /* ------------------------------------------------------------ */
123 /**
124 * @see javax.net.ssl.X509KeyManager#getCertificateChain(java.lang.String)
125 */
126 public X509Certificate[] getCertificateChain(String alias)
127 {
128 return _delegate.getCertificateChain(alias);
129 }
130
131 /* ------------------------------------------------------------ */
132 /**
133 * @see javax.net.ssl.X509KeyManager#getPrivateKey(java.lang.String)
134 */
135 public PrivateKey getPrivateKey(String alias)
136 {
137 return _delegate.getPrivateKey(alias);
138 }
139
140 /* ------------------------------------------------------------ */
141 /**
142 * @see javax.net.ssl.X509ExtendedKeyManager#chooseEngineServerAlias(java.lang.String, java.security.Principal[], javax.net.ssl.SSLEngine)
143 */
144 @Override
145 public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine)
146 {
147 if (_alias==null)
148 return _delegate.chooseEngineServerAlias(keyType,issuers,engine);
149
150 String[] aliases = _delegate.getServerAliases(keyType,issuers);
151 if (aliases!=null)
152 {
153 for (String a:aliases)
154 if (_alias.equals(a))
155 return _alias;
156 }
157
158 return null;
159 }
160
161
162 /* ------------------------------------------------------------ */
163 /**
164 * @see javax.net.ssl.X509ExtendedKeyManager#chooseEngineClientAlias(String[], Principal[], SSLEngine)
165 */
166 @Override
167 public String chooseEngineClientAlias(String keyType[], Principal[] issuers, SSLEngine engine)
168 {
169 if (_alias==null)
170 return _delegate.chooseEngineClientAlias(keyType,issuers,engine);
171
172 for (String kt : keyType)
173 {
174 String[] aliases = _delegate.getClientAliases(kt,issuers);
175 if (aliases!=null)
176 {
177 for (String a:aliases)
178 if (_alias.equals(a))
179 return _alias;
180 }
181 }
182
183 return null;
184 }
185 }