View Javadoc

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 }