comparison src/org/eclipse/jetty/util/ssl/SslContextFactory.java @ 1002:35d04ac3fd0b

simplify ssl
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 22 Oct 2016 21:56:44 -0600
parents 8e9db0bbf4f9
children
comparison
equal deleted inserted replaced
1001:39154cfa58e4 1002:35d04ac3fd0b
71 * creates SSL context based on these parameters to be 71 * creates SSL context based on these parameters to be
72 * used by the SSL connectors. 72 * used by the SSL connectors.
73 */ 73 */
74 public class SslContextFactory extends AbstractLifeCycle 74 public class SslContextFactory extends AbstractLifeCycle
75 { 75 {
76 public final static TrustManager[] TRUST_ALL_CERTS = new X509TrustManager[]{new X509TrustManager() 76 public final static TrustManager[] TRUST_ALL_CERTS = new X509TrustManager[]{new X509TrustManager()
77 { 77 {
78 public java.security.cert.X509Certificate[] getAcceptedIssuers() 78 public java.security.cert.X509Certificate[] getAcceptedIssuers()
79 { 79 {
80 return new java.security.cert.X509Certificate[]{}; 80 return new java.security.cert.X509Certificate[]{};
81 } 81 }
82 82
83 public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) 83 public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
84 { 84 {
85 } 85 }
86 86
87 public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) 87 public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
88 { 88 {
89 } 89 }
90 }}; 90 }};
91 91
92 private static final Logger LOG = LoggerFactory.getLogger(SslContextFactory.class); 92 private static final Logger LOG = LoggerFactory.getLogger(SslContextFactory.class);
93 93
94 public static final String DEFAULT_KEYMANAGERFACTORY_ALGORITHM = 94 public static final String DEFAULT_KEYMANAGERFACTORY_ALGORITHM =
95 (Security.getProperty("ssl.KeyManagerFactory.algorithm") == null ? 95 (Security.getProperty("ssl.KeyManagerFactory.algorithm") == null ?
96 "SunX509" : Security.getProperty("ssl.KeyManagerFactory.algorithm")); 96 "SunX509" : Security.getProperty("ssl.KeyManagerFactory.algorithm"));
97 public static final String DEFAULT_TRUSTMANAGERFACTORY_ALGORITHM = 97 public static final String DEFAULT_TRUSTMANAGERFACTORY_ALGORITHM =
98 (Security.getProperty("ssl.TrustManagerFactory.algorithm") == null ? 98 (Security.getProperty("ssl.TrustManagerFactory.algorithm") == null ?
99 "SunX509" : Security.getProperty("ssl.TrustManagerFactory.algorithm")); 99 "SunX509" : Security.getProperty("ssl.TrustManagerFactory.algorithm"));
100 100
101 /** Default value for the keystore location path. */ 101 /** Default value for the keystore location path. */
102 public static final String DEFAULT_KEYSTORE_PATH = 102 public static final String DEFAULT_KEYSTORE_PATH =
103 System.getProperty("user.home") + File.separator + ".keystore"; 103 System.getProperty("user.home") + File.separator + ".keystore";
104 104
105 /** String name of key password property. */ 105 /** String name of key password property. */
106 public static final String KEYPASSWORD_PROPERTY = "org.eclipse.jetty.ssl.keypassword"; 106 public static final String KEYPASSWORD_PROPERTY = "org.eclipse.jetty.ssl.keypassword";
107 107
108 /** String name of keystore password property. */ 108 /** String name of keystore password property. */
109 public static final String PASSWORD_PROPERTY = "org.eclipse.jetty.ssl.password"; 109 public static final String PASSWORD_PROPERTY = "org.eclipse.jetty.ssl.password";
110 110
111 /** Excluded protocols. */ 111 /** Excluded protocols. */
112 private final Set<String> _excludeProtocols = new LinkedHashSet<String>(); 112 private final Set<String> _excludeProtocols = new LinkedHashSet<String>();
113 /** Included protocols. */ 113 /** Included protocols. */
114 private Set<String> _includeProtocols = null; 114 private Set<String> _includeProtocols = null;
115 115
116 /** Excluded cipher suites. */ 116 /** Excluded cipher suites. */
117 private final Set<String> _excludeCipherSuites = new LinkedHashSet<String>(); 117 private final Set<String> _excludeCipherSuites = new LinkedHashSet<String>();
118 /** Included cipher suites. */ 118 /** Included cipher suites. */
119 private Set<String> _includeCipherSuites = null; 119 private Set<String> _includeCipherSuites = null;
120 120
121 /** Keystore path. */ 121 /** Keystore path. */
122 private String _keyStorePath; 122 private String _keyStorePath;
123 /** Keystore provider name */ 123 /** Keystore provider name */
124 private String _keyStoreProvider; 124 private String _keyStoreProvider;
125 /** Keystore type */ 125 /** Keystore type */
126 private String _keyStoreType = "JKS"; 126 private String _keyStoreType = "JKS";
127 /** Keystore input stream */ 127 /** Keystore input stream */
128 private InputStream _keyStoreInputStream; 128 private InputStream _keyStoreInputStream;
129 129
130 /** SSL certificate alias */ 130 /** SSL certificate alias */
131 private String _certAlias; 131 private String _certAlias;
132 132
133 /** Truststore path */ 133 /** Truststore path */
134 private String _trustStorePath; 134 private String _trustStorePath;
135 /** Truststore provider name */ 135 /** Truststore provider name */
136 private String _trustStoreProvider; 136 private String _trustStoreProvider;
137 /** Truststore type */ 137 /** Truststore type */
138 private String _trustStoreType = "JKS"; 138 private String _trustStoreType = "JKS";
139 /** Truststore input stream */ 139 /** Truststore input stream */
140 private InputStream _trustStoreInputStream; 140 private InputStream _trustStoreInputStream;
141 141
142 /** Set to true if client certificate authentication is required */ 142 /** Set to true if client certificate authentication is required */
143 private boolean _needClientAuth = false; 143 private boolean _needClientAuth = false;
144 /** Set to true if client certificate authentication is desired */ 144 /** Set to true if client certificate authentication is desired */
145 private boolean _wantClientAuth = false; 145 private boolean _wantClientAuth = false;
146 146
147 /** Set to true if renegotiation is allowed */ 147 /** Set to true if renegotiation is allowed */
148 private boolean _allowRenegotiate = true; 148 private boolean _allowRenegotiate = true;
149 149
150 /** Keystore password */ 150 /** Keystore password */
151 private transient Password _keyStorePassword; 151 private transient Password _keyStorePassword;
152 /** Key manager password */ 152 /** Key manager password */
153 private transient Password _keyManagerPassword; 153 private transient Password _keyManagerPassword;
154 /** Truststore password */ 154 /** Truststore password */
155 private transient Password _trustStorePassword; 155 private transient Password _trustStorePassword;
156 156
157 /** SSL provider name */ 157 /** SSL provider name */
158 private String _sslProvider; 158 private String _sslProvider;
159 /** SSL protocol name */ 159 /** SSL protocol name */
160 private String _sslProtocol = "TLS"; 160 private String _sslProtocol = "TLS";
161 161
162 /** SecureRandom algorithm */ 162 /** SecureRandom algorithm */
163 private String _secureRandomAlgorithm; 163 private String _secureRandomAlgorithm;
164 /** KeyManager factory algorithm */ 164 /** KeyManager factory algorithm */
165 private String _keyManagerFactoryAlgorithm = DEFAULT_KEYMANAGERFACTORY_ALGORITHM; 165 private String _keyManagerFactoryAlgorithm = DEFAULT_KEYMANAGERFACTORY_ALGORITHM;
166 /** TrustManager factory algorithm */ 166 /** TrustManager factory algorithm */
167 private String _trustManagerFactoryAlgorithm = DEFAULT_TRUSTMANAGERFACTORY_ALGORITHM; 167 private String _trustManagerFactoryAlgorithm = DEFAULT_TRUSTMANAGERFACTORY_ALGORITHM;
168 168
169 /** Set to true if SSL certificate validation is required */ 169 /** Set to true if SSL certificate validation is required */
170 private boolean _validateCerts; 170 private boolean _validateCerts;
171 /** Set to true if SSL certificate of the peer validation is required */ 171 /** Set to true if SSL certificate of the peer validation is required */
172 private boolean _validatePeerCerts; 172 private boolean _validatePeerCerts;
173 /** Maximum certification path length (n - number of intermediate certs, -1 for unlimited) */ 173 /** Maximum certification path length (n - number of intermediate certs, -1 for unlimited) */
174 private int _maxCertPathLength = -1; 174 private int _maxCertPathLength = -1;
175 /** Path to file that contains Certificate Revocation List */ 175 /** Path to file that contains Certificate Revocation List */
176 private String _crlPath; 176 private String _crlPath;
177 /** Set to true to enable CRL Distribution Points (CRLDP) support */ 177 /** Set to true to enable CRL Distribution Points (CRLDP) support */
178 private boolean _enableCRLDP = false; 178 private boolean _enableCRLDP = false;
179 /** Set to true to enable On-Line Certificate Status Protocol (OCSP) support */ 179 /** Set to true to enable On-Line Certificate Status Protocol (OCSP) support */
180 private boolean _enableOCSP = false; 180 private boolean _enableOCSP = false;
181 /** Location of OCSP Responder */ 181 /** Location of OCSP Responder */
182 private String _ocspResponderURL; 182 private String _ocspResponderURL;
183 183
184 /** SSL keystore */ 184 /** SSL keystore */
185 private KeyStore _keyStore; 185 private KeyStore _keyStore;
186 /** SSL truststore */ 186 /** SSL truststore */
187 private KeyStore _trustStore; 187 private KeyStore _trustStore;
188 /** Set to true to enable SSL Session caching */ 188 /** Set to true to enable SSL Session caching */
189 private boolean _sessionCachingEnabled = true; 189 private boolean _sessionCachingEnabled = true;
190 /** SSL session cache size */ 190 /** SSL session cache size */
191 private int _sslSessionCacheSize; 191 private int _sslSessionCacheSize;
192 /** SSL session timeout */ 192 /** SSL session timeout */
193 private int _sslSessionTimeout; 193 private int _sslSessionTimeout;
194 194
195 /** SSL context */ 195 /** SSL context */
196 private SSLContext _context; 196 private SSLContext _context;
197 197
198 private boolean _trustAll; 198 private boolean _trustAll;
199 199
200 /* ------------------------------------------------------------ */ 200 /* ------------------------------------------------------------ */
201 /** 201 /**
202 * Construct an instance of SslContextFactory 202 * Construct an instance of SslContextFactory
203 * Default constructor for use in XmlConfiguration files 203 * Default constructor for use in XmlConfiguration files
204 */ 204 */
205 public SslContextFactory() 205 public SslContextFactory()
206 { 206 {
207 _trustAll=true; 207 _trustAll=true;
208 } 208 }
209 209
210 /* ------------------------------------------------------------ */ 210 /* ------------------------------------------------------------ */
211 /** 211 /**
212 * Construct an instance of SslContextFactory 212 * Construct an instance of SslContextFactory
213 * Default constructor for use in XmlConfiguration files 213 * Default constructor for use in XmlConfiguration files
214 * @param trustAll whether to blindly trust all certificates 214 * @param trustAll whether to blindly trust all certificates
215 * @see #setTrustAll(boolean) 215 * @see #setTrustAll(boolean)
216 */ 216 */
217 public SslContextFactory(boolean trustAll) 217 public SslContextFactory(boolean trustAll)
218 { 218 {
219 _trustAll=trustAll; 219 _trustAll=trustAll;
220 } 220 }
221 221
222 /* ------------------------------------------------------------ */ 222 /* ------------------------------------------------------------ */
223 /** 223 /**
224 * Construct an instance of SslContextFactory 224 * Construct an instance of SslContextFactory
225 * @param keyStorePath default keystore location 225 * @param keyStorePath default keystore location
226 */ 226 */
227 public SslContextFactory(String keyStorePath) 227 public SslContextFactory(String keyStorePath)
228 { 228 {
229 _keyStorePath = keyStorePath; 229 _keyStorePath = keyStorePath;
230 } 230 }
231 231
232 /* ------------------------------------------------------------ */ 232 /* ------------------------------------------------------------ */
233 /** 233 /**
234 * Create the SSLContext object and start the lifecycle 234 * Create the SSLContext object and start the lifecycle
235 * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() 235 * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart()
236 */ 236 */
237 @Override 237 @Override
238 protected void doStart() throws Exception 238 protected void doStart() throws Exception
239 { 239 {
240 if (_context == null) 240 if (_context == null)
241 { 241 {
242 if (_keyStore==null && _keyStoreInputStream == null && _keyStorePath == null && 242 if (_keyStore==null && _keyStoreInputStream == null && _keyStorePath == null &&
243 _trustStore==null && _trustStoreInputStream == null && _trustStorePath == null ) 243 _trustStore==null && _trustStoreInputStream == null && _trustStorePath == null )
244 { 244 {
245 TrustManager[] trust_managers=null; 245 TrustManager[] trust_managers=null;
246 246
247 if (_trustAll) 247 if (_trustAll)
248 { 248 {
249 LOG.debug("No keystore or trust store configured. ACCEPTING UNTRUSTED CERTIFICATES!!!!!"); 249 LOG.debug("No keystore or trust store configured. ACCEPTING UNTRUSTED CERTIFICATES!!!!!");
250 // Create a trust manager that does not validate certificate chains 250 // Create a trust manager that does not validate certificate chains
251 trust_managers = TRUST_ALL_CERTS; 251 trust_managers = TRUST_ALL_CERTS;
252 } 252 }
253 253
254 SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm); 254 SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm);
255 _context = SSLContext.getInstance(_sslProtocol); 255 _context = SSLContext.getInstance(_sslProtocol);
256 _context.init(null, trust_managers, secureRandom); 256 _context.init(null, trust_managers, secureRandom);
257 } 257 }
258 else 258 else
259 { 259 {
260 // verify that keystore and truststore 260 // verify that keystore and truststore
261 // parameters are set up correctly 261 // parameters are set up correctly
262 checkKeyStore(); 262 checkKeyStore();
263 263
264 KeyStore keyStore = loadKeyStore(); 264 KeyStore keyStore = loadKeyStore();
265 KeyStore trustStore = loadTrustStore(); 265 KeyStore trustStore = loadTrustStore();
266 266
267 Collection<? extends CRL> crls = loadCRL(_crlPath); 267 Collection<? extends CRL> crls = loadCRL(_crlPath);
268 268
269 if (_validateCerts && keyStore != null) 269 if (_validateCerts && keyStore != null)
270 { 270 {
271 if (_certAlias == null) 271 if (_certAlias == null)
272 { 272 {
273 List<String> aliases = Collections.list(keyStore.aliases()); 273 List<String> aliases = Collections.list(keyStore.aliases());
274 _certAlias = aliases.size() == 1 ? aliases.get(0) : null; 274 _certAlias = aliases.size() == 1 ? aliases.get(0) : null;
275 } 275 }
276 276
277 Certificate cert = _certAlias == null?null:keyStore.getCertificate(_certAlias); 277 Certificate cert = _certAlias == null?null:keyStore.getCertificate(_certAlias);
278 if (cert == null) 278 if (cert == null)
279 { 279 {
280 throw new Exception("No certificate found in the keystore" + (_certAlias==null ? "":" for alias " + _certAlias)); 280 throw new Exception("No certificate found in the keystore" + (_certAlias==null ? "":" for alias " + _certAlias));
281 } 281 }
282 282
283 CertificateValidator validator = new CertificateValidator(trustStore, crls); 283 CertificateValidator validator = new CertificateValidator(trustStore, crls);
284 validator.setMaxCertPathLength(_maxCertPathLength); 284 validator.setMaxCertPathLength(_maxCertPathLength);
285 validator.setEnableCRLDP(_enableCRLDP); 285 validator.setEnableCRLDP(_enableCRLDP);
286 validator.setEnableOCSP(_enableOCSP); 286 validator.setEnableOCSP(_enableOCSP);
287 validator.setOcspResponderURL(_ocspResponderURL); 287 validator.setOcspResponderURL(_ocspResponderURL);
288 validator.validate(keyStore, cert); 288 validator.validate(keyStore, cert);
289 } 289 }
290 290
291 KeyManager[] keyManagers = getKeyManagers(keyStore); 291 KeyManager[] keyManagers = getKeyManagers(keyStore);
292 TrustManager[] trustManagers = getTrustManagers(trustStore,crls); 292 TrustManager[] trustManagers = getTrustManagers(trustStore,crls);
293 293
294 SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm); 294 SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm);
295 _context = (_sslProvider == null)?SSLContext.getInstance(_sslProtocol):SSLContext.getInstance(_sslProtocol,_sslProvider); 295 _context = (_sslProvider == null)?SSLContext.getInstance(_sslProtocol):SSLContext.getInstance(_sslProtocol,_sslProvider);
296 _context.init(keyManagers,trustManagers,secureRandom); 296 _context.init(keyManagers,trustManagers,secureRandom);
297 297
298 SSLEngine engine=newSslEngine(); 298 SSLEngine engine=newSslEngine();
299 299
300 LOG.info("Enabled Protocols {} of {}",Arrays.asList(engine.getEnabledProtocols()),Arrays.asList(engine.getSupportedProtocols())); 300 LOG.info("Enabled Protocols {} of {}",Arrays.asList(engine.getEnabledProtocols()),Arrays.asList(engine.getSupportedProtocols()));
301 if (LOG.isDebugEnabled()) 301 if (LOG.isDebugEnabled())
302 LOG.debug("Enabled Ciphers {} of {}",Arrays.asList(engine.getEnabledCipherSuites()),Arrays.asList(engine.getSupportedCipherSuites())); 302 LOG.debug("Enabled Ciphers {} of {}",Arrays.asList(engine.getEnabledCipherSuites()),Arrays.asList(engine.getSupportedCipherSuites()));
303 } 303 }
304 } 304 }
305 } 305 }
306 306
307 /* ------------------------------------------------------------ */ 307 /* ------------------------------------------------------------ */
308 /** 308 /**
309 * @return The array of protocol names to exclude from 309 * @return The array of protocol names to exclude from
310 * {@link SSLEngine#setEnabledProtocols(String[])} 310 * {@link SSLEngine#setEnabledProtocols(String[])}
311 */ 311 */
312 public String[] getExcludeProtocols() 312 public String[] getExcludeProtocols()
313 { 313 {
314 return _excludeProtocols.toArray(new String[_excludeProtocols.size()]); 314 return _excludeProtocols.toArray(new String[_excludeProtocols.size()]);
315 } 315 }
316 316
317 /* ------------------------------------------------------------ */ 317 /* ------------------------------------------------------------ */
318 /** 318 /**
319 * @param protocols 319 * @param protocols
320 * The array of protocol names to exclude from 320 * The array of protocol names to exclude from
321 * {@link SSLEngine#setEnabledProtocols(String[])} 321 * {@link SSLEngine#setEnabledProtocols(String[])}
322 */ 322 */
323 public void setExcludeProtocols(String... protocols) 323 public void setExcludeProtocols(String... protocols)
324 { 324 {
325 checkNotStarted(); 325 checkNotStarted();
326 326
327 _excludeProtocols.clear(); 327 _excludeProtocols.clear();
328 _excludeProtocols.addAll(Arrays.asList(protocols)); 328 _excludeProtocols.addAll(Arrays.asList(protocols));
329 } 329 }
330 330
331 /* ------------------------------------------------------------ */ 331 /* ------------------------------------------------------------ */
332 /** 332 /**
333 * @param protocol Protocol names to add to {@link SSLEngine#setEnabledProtocols(String[])} 333 * @param protocol Protocol names to add to {@link SSLEngine#setEnabledProtocols(String[])}
334 */ 334 */
335 public void addExcludeProtocols(String... protocol) 335 public void addExcludeProtocols(String... protocol)
336 { 336 {
337 checkNotStarted(); 337 checkNotStarted();
338 _excludeProtocols.addAll(Arrays.asList(protocol)); 338 _excludeProtocols.addAll(Arrays.asList(protocol));
339 } 339 }
340 340
341 /* ------------------------------------------------------------ */ 341 /* ------------------------------------------------------------ */
342 /** 342 /**
343 * @return The array of protocol names to include in 343 * @return The array of protocol names to include in
344 * {@link SSLEngine#setEnabledProtocols(String[])} 344 * {@link SSLEngine#setEnabledProtocols(String[])}
345 */ 345 */
346 public String[] getIncludeProtocols() 346 public String[] getIncludeProtocols()
347 { 347 {
348 return _includeProtocols.toArray(new String[_includeProtocols.size()]); 348 return _includeProtocols.toArray(new String[_includeProtocols.size()]);
349 } 349 }
350 350
351 /* ------------------------------------------------------------ */ 351 /* ------------------------------------------------------------ */
352 /** 352 /**
353 * @param protocols 353 * @param protocols
354 * The array of protocol names to include in 354 * The array of protocol names to include in
355 * {@link SSLEngine#setEnabledProtocols(String[])} 355 * {@link SSLEngine#setEnabledProtocols(String[])}
356 */ 356 */
357 public void setIncludeProtocols(String... protocols) 357 public void setIncludeProtocols(String... protocols)
358 { 358 {
359 checkNotStarted(); 359 checkNotStarted();
360 360
361 _includeProtocols = new LinkedHashSet<String>(Arrays.asList(protocols)); 361 _includeProtocols = new LinkedHashSet<String>(Arrays.asList(protocols));
362 } 362 }
363 363
364 /* ------------------------------------------------------------ */ 364 /* ------------------------------------------------------------ */
365 /** 365 /**
366 * @return The array of cipher suite names to exclude from 366 * @return The array of cipher suite names to exclude from
367 * {@link SSLEngine#setEnabledCipherSuites(String[])} 367 * {@link SSLEngine#setEnabledCipherSuites(String[])}
368 */ 368 */
369 public String[] getExcludeCipherSuites() 369 public String[] getExcludeCipherSuites()
370 { 370 {
371 return _excludeCipherSuites.toArray(new String[_excludeCipherSuites.size()]); 371 return _excludeCipherSuites.toArray(new String[_excludeCipherSuites.size()]);
372 } 372 }
373 373
374 /* ------------------------------------------------------------ */ 374 /* ------------------------------------------------------------ */
375 /** 375 /**
376 * @param cipherSuites 376 * @param cipherSuites
377 * The array of cipher suite names to exclude from 377 * The array of cipher suite names to exclude from
378 * {@link SSLEngine#setEnabledCipherSuites(String[])} 378 * {@link SSLEngine#setEnabledCipherSuites(String[])}
379 */ 379 */
380 public void setExcludeCipherSuites(String... cipherSuites) 380 public void setExcludeCipherSuites(String... cipherSuites)
381 { 381 {
382 checkNotStarted(); 382 checkNotStarted();
383 _excludeCipherSuites.clear(); 383 _excludeCipherSuites.clear();
384 _excludeCipherSuites.addAll(Arrays.asList(cipherSuites)); 384 _excludeCipherSuites.addAll(Arrays.asList(cipherSuites));
385 } 385 }
386 386
387 /* ------------------------------------------------------------ */ 387 /* ------------------------------------------------------------ */
388 /** 388 /**
389 * @param cipher Cipher names to add to {@link SSLEngine#setEnabledCipherSuites(String[])} 389 * @param cipher Cipher names to add to {@link SSLEngine#setEnabledCipherSuites(String[])}
390 */ 390 */
391 public void addExcludeCipherSuites(String... cipher) 391 public void addExcludeCipherSuites(String... cipher)
392 { 392 {
393 checkNotStarted(); 393 checkNotStarted();
394 _excludeCipherSuites.addAll(Arrays.asList(cipher)); 394 _excludeCipherSuites.addAll(Arrays.asList(cipher));
395 } 395 }
396 396
397 /* ------------------------------------------------------------ */ 397 /* ------------------------------------------------------------ */
398 /** 398 /**
399 * @return The array of cipher suite names to include in 399 * @return The array of cipher suite names to include in
400 * {@link SSLEngine#setEnabledCipherSuites(String[])} 400 * {@link SSLEngine#setEnabledCipherSuites(String[])}
401 */ 401 */
402 public String[] getIncludeCipherSuites() 402 public String[] getIncludeCipherSuites()
403 { 403 {
404 return _includeCipherSuites.toArray(new String[_includeCipherSuites.size()]); 404 return _includeCipherSuites.toArray(new String[_includeCipherSuites.size()]);
405 } 405 }
406 406
407 /* ------------------------------------------------------------ */ 407 /* ------------------------------------------------------------ */
408 /** 408 /**
409 * @param cipherSuites 409 * @param cipherSuites
410 * The array of cipher suite names to include in 410 * The array of cipher suite names to include in
411 * {@link SSLEngine#setEnabledCipherSuites(String[])} 411 * {@link SSLEngine#setEnabledCipherSuites(String[])}
412 */ 412 */
413 public void setIncludeCipherSuites(String... cipherSuites) 413 public void setIncludeCipherSuites(String... cipherSuites)
414 { 414 {
415 checkNotStarted(); 415 checkNotStarted();
416 416
417 _includeCipherSuites = new LinkedHashSet<String>(Arrays.asList(cipherSuites)); 417 _includeCipherSuites = new LinkedHashSet<String>(Arrays.asList(cipherSuites));
418 } 418 }
419 419
420 /* ------------------------------------------------------------ */ 420 /* ------------------------------------------------------------ */
421 /** 421 /**
422 * @return The file or URL of the SSL Key store. 422 * @return The file or URL of the SSL Key store.
423 */ 423 */
424 public String getKeyStorePath() 424 public String getKeyStorePath()
425 { 425 {
426 return _keyStorePath; 426 return _keyStorePath;
427 } 427 }
428 428
429 /* ------------------------------------------------------------ */ 429 /* ------------------------------------------------------------ */
430 @Deprecated 430 @Deprecated
431 public String getKeyStore() 431 public String getKeyStore()
432 { 432 {
433 return _keyStorePath; 433 return _keyStorePath;
434 } 434 }
435 435
436 /* ------------------------------------------------------------ */ 436 /* ------------------------------------------------------------ */
437 /** 437 /**
438 * @param keyStorePath 438 * @param keyStorePath
439 * The file or URL of the SSL Key store. 439 * The file or URL of the SSL Key store.
440 */ 440 */
441 public void setKeyStorePath(String keyStorePath) 441 public void setKeyStorePath(String keyStorePath)
442 { 442 {
443 checkNotStarted(); 443 checkNotStarted();
444 444
445 _keyStorePath = keyStorePath; 445 _keyStorePath = keyStorePath;
446 } 446 }
447 447
448 /* ------------------------------------------------------------ */ 448 /* ------------------------------------------------------------ */
449 /** 449 /**
450 * @param keyStorePath the file system path or URL of the keystore 450 * @param keyStorePath the file system path or URL of the keystore
451 * @deprecated Use {@link #setKeyStorePath(String)} 451 * @deprecated Use {@link #setKeyStorePath(String)}
452 */ 452 */
453 @Deprecated 453 @Deprecated
454 public void setKeyStore(String keyStorePath) 454 public void setKeyStore(String keyStorePath)
455 { 455 {
456 checkNotStarted(); 456 checkNotStarted();
457 457
458 _keyStorePath = keyStorePath; 458 _keyStorePath = keyStorePath;
459 } 459 }
460 460
461 /* ------------------------------------------------------------ */ 461 /* ------------------------------------------------------------ */
462 /** 462 /**
463 * @return The provider of the key store 463 * @return The provider of the key store
464 */ 464 */
465 public String getKeyStoreProvider() 465 public String getKeyStoreProvider()
466 { 466 {
467 return _keyStoreProvider; 467 return _keyStoreProvider;
468 } 468 }
469 469
470 /* ------------------------------------------------------------ */ 470 /* ------------------------------------------------------------ */
471 /** 471 /**
472 * @param keyStoreProvider 472 * @param keyStoreProvider
473 * The provider of the key store 473 * The provider of the key store
474 */ 474 */
475 public void setKeyStoreProvider(String keyStoreProvider) 475 public void setKeyStoreProvider(String keyStoreProvider)
476 { 476 {
477 checkNotStarted(); 477 checkNotStarted();
478 478
479 _keyStoreProvider = keyStoreProvider; 479 _keyStoreProvider = keyStoreProvider;
480 } 480 }
481 481
482 /* ------------------------------------------------------------ */ 482 /* ------------------------------------------------------------ */
483 /** 483 /**
484 * @return The type of the key store (default "JKS") 484 * @return The type of the key store (default "JKS")
485 */ 485 */
486 public String getKeyStoreType() 486 public String getKeyStoreType()
487 { 487 {
488 return (_keyStoreType); 488 return (_keyStoreType);
489 } 489 }
490 490
491 /* ------------------------------------------------------------ */ 491 /* ------------------------------------------------------------ */
492 /** 492 /**
493 * @param keyStoreType 493 * @param keyStoreType
494 * The type of the key store (default "JKS") 494 * The type of the key store (default "JKS")
495 */ 495 */
496 public void setKeyStoreType(String keyStoreType) 496 public void setKeyStoreType(String keyStoreType)
497 { 497 {
498 checkNotStarted(); 498 checkNotStarted();
499 499
500 _keyStoreType = keyStoreType; 500 _keyStoreType = keyStoreType;
501 } 501 }
502 502
503 /* ------------------------------------------------------------ */ 503 /* ------------------------------------------------------------ */
504 /** Get the _keyStoreInputStream. 504 /** Get the _keyStoreInputStream.
505 * @return the _keyStoreInputStream 505 * @return the _keyStoreInputStream
506 * 506 *
507 * @deprecated 507 * @deprecated
508 */ 508 */
509 @Deprecated 509 @Deprecated
510 public InputStream getKeyStoreInputStream() 510 public InputStream getKeyStoreInputStream()
511 { 511 {
512 checkKeyStore(); 512 checkKeyStore();
513 513
514 return _keyStoreInputStream; 514 return _keyStoreInputStream;
515 } 515 }
516 516
517 /* ------------------------------------------------------------ */ 517 /* ------------------------------------------------------------ */
518 /** Set the keyStoreInputStream. 518 /** Set the keyStoreInputStream.
519 * @param keyStoreInputStream the InputStream to the KeyStore 519 * @param keyStoreInputStream the InputStream to the KeyStore
520 * 520 *
521 * @deprecated Use {@link #setKeyStore(KeyStore)} 521 * @deprecated Use {@link #setKeyStore(KeyStore)}
522 */ 522 */
523 @Deprecated 523 @Deprecated
524 public void setKeyStoreInputStream(InputStream keyStoreInputStream) 524 public void setKeyStoreInputStream(InputStream keyStoreInputStream)
525 { 525 {
526 checkNotStarted(); 526 checkNotStarted();
527 527
528 _keyStoreInputStream = keyStoreInputStream; 528 _keyStoreInputStream = keyStoreInputStream;
529 } 529 }
530 530
531 /* ------------------------------------------------------------ */ 531 /* ------------------------------------------------------------ */
532 /** 532 /**
533 * @return Alias of SSL certificate for the connector 533 * @return Alias of SSL certificate for the connector
534 */ 534 */
535 public String getCertAlias() 535 public String getCertAlias()
536 { 536 {
537 return _certAlias; 537 return _certAlias;
538 } 538 }
539 539
540 /* ------------------------------------------------------------ */ 540 /* ------------------------------------------------------------ */
541 /** 541 /**
542 * @param certAlias 542 * @param certAlias
543 * Alias of SSL certificate for the connector 543 * Alias of SSL certificate for the connector
544 */ 544 */
545 public void setCertAlias(String certAlias) 545 public void setCertAlias(String certAlias)
546 { 546 {
547 checkNotStarted(); 547 checkNotStarted();
548 548
549 _certAlias = certAlias; 549 _certAlias = certAlias;
550 } 550 }
551 551
552 /* ------------------------------------------------------------ */ 552 /* ------------------------------------------------------------ */
553 /** 553 /**
554 * @return The file name or URL of the trust store location 554 * @return The file name or URL of the trust store location
555 */ 555 */
556 public String getTrustStore() 556 public String getTrustStore()
557 { 557 {
558 return _trustStorePath; 558 return _trustStorePath;
559 } 559 }
560 560
561 /* ------------------------------------------------------------ */ 561 /* ------------------------------------------------------------ */
562 /** 562 /**
563 * @param trustStorePath 563 * @param trustStorePath
564 * The file name or URL of the trust store location 564 * The file name or URL of the trust store location
565 */ 565 */
566 public void setTrustStore(String trustStorePath) 566 public void setTrustStore(String trustStorePath)
567 { 567 {
568 checkNotStarted(); 568 checkNotStarted();
569 569
570 _trustStorePath = trustStorePath; 570 _trustStorePath = trustStorePath;
571 } 571 }
572 572
573 /* ------------------------------------------------------------ */ 573 /* ------------------------------------------------------------ */
574 /** 574 /**
575 * @return The provider of the trust store 575 * @return The provider of the trust store
576 */ 576 */
577 public String getTrustStoreProvider() 577 public String getTrustStoreProvider()
578 { 578 {
579 return _trustStoreProvider; 579 return _trustStoreProvider;
580 } 580 }
581 581
582 /* ------------------------------------------------------------ */ 582 /* ------------------------------------------------------------ */
583 /** 583 /**
584 * @param trustStoreProvider 584 * @param trustStoreProvider
585 * The provider of the trust store 585 * The provider of the trust store
586 */ 586 */
587 public void setTrustStoreProvider(String trustStoreProvider) 587 public void setTrustStoreProvider(String trustStoreProvider)
588 { 588 {
589 checkNotStarted(); 589 checkNotStarted();
590 590
591 _trustStoreProvider = trustStoreProvider; 591 _trustStoreProvider = trustStoreProvider;
592 } 592 }
593 593
594 /* ------------------------------------------------------------ */ 594 /* ------------------------------------------------------------ */
595 /** 595 /**
596 * @return The type of the trust store (default "JKS") 596 * @return The type of the trust store (default "JKS")
597 */ 597 */
598 public String getTrustStoreType() 598 public String getTrustStoreType()
599 { 599 {
600 return _trustStoreType; 600 return _trustStoreType;
601 } 601 }
602 602
603 /* ------------------------------------------------------------ */ 603 /* ------------------------------------------------------------ */
604 /** 604 /**
605 * @param trustStoreType 605 * @param trustStoreType
606 * The type of the trust store (default "JKS") 606 * The type of the trust store (default "JKS")
607 */ 607 */
608 public void setTrustStoreType(String trustStoreType) 608 public void setTrustStoreType(String trustStoreType)
609 { 609 {
610 checkNotStarted(); 610 checkNotStarted();
611 611
612 _trustStoreType = trustStoreType; 612 _trustStoreType = trustStoreType;
613 } 613 }
614 614
615 /* ------------------------------------------------------------ */ 615 /* ------------------------------------------------------------ */
616 /** Get the _trustStoreInputStream. 616 /** Get the _trustStoreInputStream.
617 * @return the _trustStoreInputStream 617 * @return the _trustStoreInputStream
618 * 618 *
619 * @deprecated 619 * @deprecated
620 */ 620 */
621 @Deprecated 621 @Deprecated
622 public InputStream getTrustStoreInputStream() 622 public InputStream getTrustStoreInputStream()
623 { 623 {
624 checkKeyStore(); 624 checkKeyStore();
625 625
626 return _trustStoreInputStream; 626 return _trustStoreInputStream;
627 } 627 }
628 628
629 /* ------------------------------------------------------------ */ 629 /* ------------------------------------------------------------ */
630 /** Set the _trustStoreInputStream. 630 /** Set the _trustStoreInputStream.
631 * @param trustStoreInputStream the InputStream to the TrustStore 631 * @param trustStoreInputStream the InputStream to the TrustStore
632 * 632 *
633 * @deprecated 633 * @deprecated
634 */ 634 */
635 @Deprecated 635 @Deprecated
636 public void setTrustStoreInputStream(InputStream trustStoreInputStream) 636 public void setTrustStoreInputStream(InputStream trustStoreInputStream)
637 { 637 {
638 checkNotStarted(); 638 checkNotStarted();
639 639
640 _trustStoreInputStream = trustStoreInputStream; 640 _trustStoreInputStream = trustStoreInputStream;
641 } 641 }
642 642
643 /* ------------------------------------------------------------ */ 643 /* ------------------------------------------------------------ */
644 /** 644 /**
645 * @return True if SSL needs client authentication. 645 * @return True if SSL needs client authentication.
646 * @see SSLEngine#getNeedClientAuth() 646 * @see SSLEngine#getNeedClientAuth()
647 */ 647 */
648 public boolean getNeedClientAuth() 648 public boolean getNeedClientAuth()
649 { 649 {
650 return _needClientAuth; 650 return _needClientAuth;
651 } 651 }
652 652
653 /* ------------------------------------------------------------ */ 653 /* ------------------------------------------------------------ */
654 /** 654 /**
655 * @param needClientAuth 655 * @param needClientAuth
656 * True if SSL needs client authentication. 656 * True if SSL needs client authentication.
657 * @see SSLEngine#getNeedClientAuth() 657 * @see SSLEngine#getNeedClientAuth()
658 */ 658 */
659 public void setNeedClientAuth(boolean needClientAuth) 659 public void setNeedClientAuth(boolean needClientAuth)
660 { 660 {
661 checkNotStarted(); 661 checkNotStarted();
662 662
663 _needClientAuth = needClientAuth; 663 _needClientAuth = needClientAuth;
664 } 664 }
665 665
666 /* ------------------------------------------------------------ */ 666 /* ------------------------------------------------------------ */
667 /** 667 /**
668 * @return True if SSL wants client authentication. 668 * @return True if SSL wants client authentication.
669 * @see SSLEngine#getWantClientAuth() 669 * @see SSLEngine#getWantClientAuth()
670 */ 670 */
671 public boolean getWantClientAuth() 671 public boolean getWantClientAuth()
672 { 672 {
673 return _wantClientAuth; 673 return _wantClientAuth;
674 } 674 }
675 675
676 /* ------------------------------------------------------------ */ 676 /* ------------------------------------------------------------ */
677 /** 677 /**
678 * @param wantClientAuth 678 * @param wantClientAuth
679 * True if SSL wants client authentication. 679 * True if SSL wants client authentication.
680 * @see SSLEngine#getWantClientAuth() 680 * @see SSLEngine#getWantClientAuth()
681 */ 681 */
682 public void setWantClientAuth(boolean wantClientAuth) 682 public void setWantClientAuth(boolean wantClientAuth)
683 { 683 {
684 checkNotStarted(); 684 checkNotStarted();
685 685
686 _wantClientAuth = wantClientAuth; 686 _wantClientAuth = wantClientAuth;
687 } 687 }
688 688
689 /* ------------------------------------------------------------ */ 689 /* ------------------------------------------------------------ */
690 /** 690 /**
691 * @return true if SSL certificate has to be validated 691 * @return true if SSL certificate has to be validated
692 * @deprecated 692 * @deprecated
693 */ 693 */
694 @Deprecated 694 @Deprecated
695 public boolean getValidateCerts() 695 public boolean getValidateCerts()
696 { 696 {
697 return _validateCerts; 697 return _validateCerts;
698 } 698 }
699 699
700 /* ------------------------------------------------------------ */ 700 /* ------------------------------------------------------------ */
701 /** 701 /**
702 * @return true if SSL certificate has to be validated 702 * @return true if SSL certificate has to be validated
703 */ 703 */
704 public boolean isValidateCerts() 704 public boolean isValidateCerts()
705 { 705 {
706 return _validateCerts; 706 return _validateCerts;
707 } 707 }
708 708
709 /* ------------------------------------------------------------ */ 709 /* ------------------------------------------------------------ */
710 /** 710 /**
711 * @param validateCerts 711 * @param validateCerts
712 * true if SSL certificates have to be validated 712 * true if SSL certificates have to be validated
713 */ 713 */
714 public void setValidateCerts(boolean validateCerts) 714 public void setValidateCerts(boolean validateCerts)
715 { 715 {
716 checkNotStarted(); 716 checkNotStarted();
717 717
718 _validateCerts = validateCerts; 718 _validateCerts = validateCerts;
719 } 719 }
720 720
721 /* ------------------------------------------------------------ */ 721 /* ------------------------------------------------------------ */
722 /** 722 /**
723 * @return true if SSL certificates of the peer have to be validated 723 * @return true if SSL certificates of the peer have to be validated
724 */ 724 */
725 public boolean isValidatePeerCerts() 725 public boolean isValidatePeerCerts()
726 { 726 {
727 return _validatePeerCerts; 727 return _validatePeerCerts;
728 } 728 }
729 729
730 /* ------------------------------------------------------------ */ 730 /* ------------------------------------------------------------ */
731 /** 731 /**
732 * @param validatePeerCerts 732 * @param validatePeerCerts
733 * true if SSL certificates of the peer have to be validated 733 * true if SSL certificates of the peer have to be validated
734 */ 734 */
735 public void setValidatePeerCerts(boolean validatePeerCerts) 735 public void setValidatePeerCerts(boolean validatePeerCerts)
736 { 736 {
737 checkNotStarted(); 737 checkNotStarted();
738 738
739 _validatePeerCerts = validatePeerCerts; 739 _validatePeerCerts = validatePeerCerts;
740 } 740 }
741 741
742 /* ------------------------------------------------------------ */ 742 /* ------------------------------------------------------------ */
743 /** 743 /**
744 * @return True if SSL re-negotiation is allowed (default false) 744 * @return True if SSL re-negotiation is allowed (default false)
745 */ 745 */
746 public boolean isAllowRenegotiate() 746 public boolean isAllowRenegotiate()
747 { 747 {
748 return _allowRenegotiate; 748 return _allowRenegotiate;
749 } 749 }
750 750
751 /* ------------------------------------------------------------ */ 751 /* ------------------------------------------------------------ */
752 /** 752 /**
753 * Set if SSL re-negotiation is allowed. CVE-2009-3555 discovered 753 * Set if SSL re-negotiation is allowed. CVE-2009-3555 discovered
754 * a vulnerability in SSL/TLS with re-negotiation. If your JVM 754 * a vulnerability in SSL/TLS with re-negotiation. If your JVM
755 * does not have CVE-2009-3555 fixed, then re-negotiation should 755 * does not have CVE-2009-3555 fixed, then re-negotiation should
756 * not be allowed. CVE-2009-3555 was fixed in Sun java 1.6 with a ban 756 * not be allowed. CVE-2009-3555 was fixed in Sun java 1.6 with a ban
757 * of renegotiates in u19 and with RFC5746 in u22. 757 * of renegotiates in u19 and with RFC5746 in u22.
758 * 758 *
759 * @param allowRenegotiate 759 * @param allowRenegotiate
760 * true if re-negotiation is allowed (default false) 760 * true if re-negotiation is allowed (default false)
761 */ 761 */
762 public void setAllowRenegotiate(boolean allowRenegotiate) 762 public void setAllowRenegotiate(boolean allowRenegotiate)
763 { 763 {
764 checkNotStarted(); 764 checkNotStarted();
765 765
766 _allowRenegotiate = allowRenegotiate; 766 _allowRenegotiate = allowRenegotiate;
767 } 767 }
768 768
769 /* ------------------------------------------------------------ */ 769 /* ------------------------------------------------------------ */
770 /** 770 /**
771 * @param password 771 * @param password
772 * The password for the key store 772 * The password for the key store
773 */ 773 */
774 public void setKeyStorePassword(String password) 774 public void setKeyStorePassword(String password)
775 { 775 {
776 checkNotStarted(); 776 checkNotStarted();
777 777
778 _keyStorePassword = Password.getPassword(PASSWORD_PROPERTY,password,null); 778 _keyStorePassword = Password.getPassword(PASSWORD_PROPERTY,password,null);
779 } 779 }
780 780
781 /* ------------------------------------------------------------ */ 781 /* ------------------------------------------------------------ */
782 /** 782 /**
783 * @param password 783 * @param password
784 * The password (if any) for the specific key within the key store 784 * The password (if any) for the specific key within the key store
785 */ 785 */
786 public void setKeyManagerPassword(String password) 786 public void setKeyManagerPassword(String password)
787 { 787 {
788 checkNotStarted(); 788 checkNotStarted();
789 789
790 _keyManagerPassword = Password.getPassword(KEYPASSWORD_PROPERTY,password,null); 790 _keyManagerPassword = Password.getPassword(KEYPASSWORD_PROPERTY,password,null);
791 } 791 }
792 792
793 /* ------------------------------------------------------------ */ 793 /* ------------------------------------------------------------ */
794 /** 794 /**
795 * @param password 795 * @param password
796 * The password for the trust store 796 * The password for the trust store
797 */ 797 */
798 public void setTrustStorePassword(String password) 798 public void setTrustStorePassword(String password)
799 { 799 {
800 checkNotStarted(); 800 checkNotStarted();
801 801
802 _trustStorePassword = Password.getPassword(PASSWORD_PROPERTY,password,null); 802 _trustStorePassword = Password.getPassword(PASSWORD_PROPERTY,password,null);
803 } 803 }
804 804
805 /* ------------------------------------------------------------ */ 805 /* ------------------------------------------------------------ */
806 /** 806 /**
807 * @return The SSL provider name, which if set is passed to 807 * @return The SSL provider name, which if set is passed to
808 * {@link SSLContext#getInstance(String, String)} 808 * {@link SSLContext#getInstance(String, String)}
809 */ 809 */
810 public String getProvider() 810 public String getProvider()
811 { 811 {
812 return _sslProvider; 812 return _sslProvider;
813 } 813 }
814 814
815 /* ------------------------------------------------------------ */ 815 /* ------------------------------------------------------------ */
816 /** 816 /**
817 * @param provider 817 * @param provider
818 * The SSL provider name, which if set is passed to 818 * The SSL provider name, which if set is passed to
819 * {@link SSLContext#getInstance(String, String)} 819 * {@link SSLContext#getInstance(String, String)}
820 */ 820 */
821 public void setProvider(String provider) 821 public void setProvider(String provider)
822 { 822 {
823 checkNotStarted(); 823 checkNotStarted();
824 824
825 _sslProvider = provider; 825 _sslProvider = provider;
826 } 826 }
827 827
828 /* ------------------------------------------------------------ */ 828 /* ------------------------------------------------------------ */
829 /** 829 /**
830 * @return The SSL protocol (default "TLS") passed to 830 * @return The SSL protocol (default "TLS") passed to
831 * {@link SSLContext#getInstance(String, String)} 831 * {@link SSLContext#getInstance(String, String)}
832 */ 832 */
833 public String getProtocol() 833 public String getProtocol()
834 { 834 {
835 return _sslProtocol; 835 return _sslProtocol;
836 } 836 }
837 837
838 /* ------------------------------------------------------------ */ 838 /* ------------------------------------------------------------ */
839 /** 839 /**
840 * @param protocol 840 * @param protocol
841 * The SSL protocol (default "TLS") passed to 841 * The SSL protocol (default "TLS") passed to
842 * {@link SSLContext#getInstance(String, String)} 842 * {@link SSLContext#getInstance(String, String)}
843 */ 843 */
844 public void setProtocol(String protocol) 844 public void setProtocol(String protocol)
845 { 845 {
846 checkNotStarted(); 846 checkNotStarted();
847 847
848 _sslProtocol = protocol; 848 _sslProtocol = protocol;
849 } 849 }
850 850
851 /* ------------------------------------------------------------ */ 851 /* ------------------------------------------------------------ */
852 /** 852 /**
853 * @return The algorithm name, which if set is passed to 853 * @return The algorithm name, which if set is passed to
854 * {@link SecureRandom#getInstance(String)} to obtain the {@link SecureRandom} instance passed to 854 * {@link SecureRandom#getInstance(String)} to obtain the {@link SecureRandom} instance passed to
855 * {@link SSLContext#init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], SecureRandom)} 855 * {@link SSLContext#init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], SecureRandom)}
856 */ 856 */
857 public String getSecureRandomAlgorithm() 857 public String getSecureRandomAlgorithm()
858 { 858 {
859 return _secureRandomAlgorithm; 859 return _secureRandomAlgorithm;
860 } 860 }
861 861
862 /* ------------------------------------------------------------ */ 862 /* ------------------------------------------------------------ */
863 /** 863 /**
864 * @param algorithm 864 * @param algorithm
865 * The algorithm name, which if set is passed to 865 * The algorithm name, which if set is passed to
866 * {@link SecureRandom#getInstance(String)} to obtain the {@link SecureRandom} instance passed to 866 * {@link SecureRandom#getInstance(String)} to obtain the {@link SecureRandom} instance passed to
867 * {@link SSLContext#init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], SecureRandom)} 867 * {@link SSLContext#init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], SecureRandom)}
868 */ 868 */
869 public void setSecureRandomAlgorithm(String algorithm) 869 public void setSecureRandomAlgorithm(String algorithm)
870 { 870 {
871 checkNotStarted(); 871 checkNotStarted();
872 872
873 _secureRandomAlgorithm = algorithm; 873 _secureRandomAlgorithm = algorithm;
874 } 874 }
875 875
876 /* ------------------------------------------------------------ */ 876 /* ------------------------------------------------------------ */
877 /** 877 /**
878 * @return The algorithm name (default "SunX509") used by the {@link KeyManagerFactory} 878 * @return The algorithm name (default "SunX509") used by the {@link KeyManagerFactory}
879 */ 879 */
880 public String getSslKeyManagerFactoryAlgorithm() 880 public String getSslKeyManagerFactoryAlgorithm()
881 { 881 {
882 return (_keyManagerFactoryAlgorithm); 882 return (_keyManagerFactoryAlgorithm);
883 } 883 }
884 884
885 /* ------------------------------------------------------------ */ 885 /* ------------------------------------------------------------ */
886 /** 886 /**
887 * @param algorithm 887 * @param algorithm
888 * The algorithm name (default "SunX509") used by the {@link KeyManagerFactory} 888 * The algorithm name (default "SunX509") used by the {@link KeyManagerFactory}
889 */ 889 */
890 public void setSslKeyManagerFactoryAlgorithm(String algorithm) 890 public void setSslKeyManagerFactoryAlgorithm(String algorithm)
891 { 891 {
892 checkNotStarted(); 892 checkNotStarted();
893 893
894 _keyManagerFactoryAlgorithm = algorithm; 894 _keyManagerFactoryAlgorithm = algorithm;
895 } 895 }
896 896
897 /* ------------------------------------------------------------ */ 897 /* ------------------------------------------------------------ */
898 /** 898 /**
899 * @return The algorithm name (default "SunX509") used by the {@link TrustManagerFactory} 899 * @return The algorithm name (default "SunX509") used by the {@link TrustManagerFactory}
900 */ 900 */
901 public String getTrustManagerFactoryAlgorithm() 901 public String getTrustManagerFactoryAlgorithm()
902 { 902 {
903 return (_trustManagerFactoryAlgorithm); 903 return (_trustManagerFactoryAlgorithm);
904 } 904 }
905 905
906 /* ------------------------------------------------------------ */ 906 /* ------------------------------------------------------------ */
907 /** 907 /**
908 * @return True if all certificates should be trusted if there is no KeyStore or TrustStore 908 * @return True if all certificates should be trusted if there is no KeyStore or TrustStore
909 */ 909 */
910 public boolean isTrustAll() 910 public boolean isTrustAll()
911 { 911 {
912 return _trustAll; 912 return _trustAll;
913 } 913 }
914 914
915 /* ------------------------------------------------------------ */ 915 /* ------------------------------------------------------------ */
916 /** 916 /**
917 * @param trustAll True if all certificates should be trusted if there is no KeyStore or TrustStore 917 * @param trustAll True if all certificates should be trusted if there is no KeyStore or TrustStore
918 */ 918 */
919 public void setTrustAll(boolean trustAll) 919 public void setTrustAll(boolean trustAll)
920 { 920 {
921 _trustAll = trustAll; 921 _trustAll = trustAll;
922 } 922 }
923 923
924 /* ------------------------------------------------------------ */ 924 /* ------------------------------------------------------------ */
925 /** 925 /**
926 * @param algorithm 926 * @param algorithm
927 * The algorithm name (default "SunX509") used by the {@link TrustManagerFactory} 927 * The algorithm name (default "SunX509") used by the {@link TrustManagerFactory}
928 * Use the string "TrustAll" to install a trust manager that trusts all. 928 * Use the string "TrustAll" to install a trust manager that trusts all.
929 */ 929 */
930 public void setTrustManagerFactoryAlgorithm(String algorithm) 930 public void setTrustManagerFactoryAlgorithm(String algorithm)
931 { 931 {
932 checkNotStarted(); 932 checkNotStarted();
933 933
934 _trustManagerFactoryAlgorithm = algorithm; 934 _trustManagerFactoryAlgorithm = algorithm;
935 } 935 }
936 936
937 /* ------------------------------------------------------------ */ 937 /* ------------------------------------------------------------ */
938 /** 938 /**
939 * @return Path to file that contains Certificate Revocation List 939 * @return Path to file that contains Certificate Revocation List
940 */ 940 */
941 public String getCrlPath() 941 public String getCrlPath()
942 { 942 {
943 return _crlPath; 943 return _crlPath;
944 } 944 }
945 945
946 /* ------------------------------------------------------------ */ 946 /* ------------------------------------------------------------ */
947 /** 947 /**
948 * @param crlPath 948 * @param crlPath
949 * Path to file that contains Certificate Revocation List 949 * Path to file that contains Certificate Revocation List
950 */ 950 */
951 public void setCrlPath(String crlPath) 951 public void setCrlPath(String crlPath)
952 { 952 {
953 checkNotStarted(); 953 checkNotStarted();
954 954
955 _crlPath = crlPath; 955 _crlPath = crlPath;
956 } 956 }
957 957
958 /* ------------------------------------------------------------ */ 958 /* ------------------------------------------------------------ */
959 /** 959 /**
960 * @return Maximum number of intermediate certificates in 960 * @return Maximum number of intermediate certificates in
961 * the certification path (-1 for unlimited) 961 * the certification path (-1 for unlimited)
962 */ 962 */
963 public int getMaxCertPathLength() 963 public int getMaxCertPathLength()
964 { 964 {
965 return _maxCertPathLength; 965 return _maxCertPathLength;
966 } 966 }
967 967
968 /* ------------------------------------------------------------ */ 968 /* ------------------------------------------------------------ */
969 /** 969 /**
970 * @param maxCertPathLength 970 * @param maxCertPathLength
971 * maximum number of intermediate certificates in 971 * maximum number of intermediate certificates in
972 * the certification path (-1 for unlimited) 972 * the certification path (-1 for unlimited)
973 */ 973 */
974 public void setMaxCertPathLength(int maxCertPathLength) 974 public void setMaxCertPathLength(int maxCertPathLength)
975 { 975 {
976 checkNotStarted(); 976 checkNotStarted();
977 977
978 _maxCertPathLength = maxCertPathLength; 978 _maxCertPathLength = maxCertPathLength;
979 } 979 }
980 980
981 /* ------------------------------------------------------------ */ 981 /* ------------------------------------------------------------ */
982 /** 982 /**
983 * @return The SSLContext 983 * @return The SSLContext
984 */ 984 */
985 public SSLContext getSslContext() 985 public SSLContext getSslContext()
986 { 986 {
987 if (!isStarted()) 987 if (!isStarted())
988 throw new IllegalStateException(getState()); 988 throw new IllegalStateException(getState());
989 return _context; 989 return _context;
990 } 990 }
991 991
992 /* ------------------------------------------------------------ */ 992 /* ------------------------------------------------------------ */
993 /** 993 /**
994 * @param sslContext 994 * @param sslContext
995 * Set a preconfigured SSLContext 995 * Set a preconfigured SSLContext
996 */ 996 */
997 public void setSslContext(SSLContext sslContext) 997 public void setSslContext(SSLContext sslContext)
998 { 998 {
999 checkNotStarted(); 999 checkNotStarted();
1000 1000
1001 _context = sslContext; 1001 _context = sslContext;
1002 } 1002 }
1003 1003
1004 /* ------------------------------------------------------------ */ 1004 /* ------------------------------------------------------------ */
1005 /** 1005 /**
1006 * Override this method to provide alternate way to load a keystore. 1006 * Override this method to provide alternate way to load a keystore.
1007 * 1007 *
1008 * @return the key store instance 1008 * @return the key store instance
1009 * @throws Exception if the keystore cannot be loaded 1009 * @throws Exception if the keystore cannot be loaded
1010 */ 1010 */
1011 protected KeyStore loadKeyStore() throws Exception 1011 protected KeyStore loadKeyStore() throws Exception
1012 { 1012 {
1013 return _keyStore != null ? _keyStore : getKeyStore(_keyStoreInputStream, 1013 return _keyStore != null ? _keyStore : getKeyStore(_keyStoreInputStream,
1014 _keyStorePath, _keyStoreType, _keyStoreProvider, 1014 _keyStorePath, _keyStoreType, _keyStoreProvider,
1015 _keyStorePassword==null? null: _keyStorePassword.toString()); 1015 _keyStorePassword==null? null: _keyStorePassword.toString());
1016 } 1016 }
1017 1017
1018 /* ------------------------------------------------------------ */ 1018 /* ------------------------------------------------------------ */
1019 /** 1019 /**
1020 * Override this method to provide alternate way to load a truststore. 1020 * Override this method to provide alternate way to load a truststore.
1021 * 1021 *
1022 * @return the key store instance 1022 * @return the key store instance
1023 * @throws Exception if the truststore cannot be loaded 1023 * @throws Exception if the truststore cannot be loaded
1024 */ 1024 */
1025 protected KeyStore loadTrustStore() throws Exception 1025 protected KeyStore loadTrustStore() throws Exception
1026 { 1026 {
1027 return _trustStore != null ? _trustStore : getKeyStore(_trustStoreInputStream, 1027 return _trustStore != null ? _trustStore : getKeyStore(_trustStoreInputStream,
1028 _trustStorePath, _trustStoreType, _trustStoreProvider, 1028 _trustStorePath, _trustStoreType, _trustStoreProvider,
1029 _trustStorePassword==null? null: _trustStorePassword.toString()); 1029 _trustStorePassword==null? null: _trustStorePassword.toString());
1030 } 1030 }
1031 1031
1032 /* ------------------------------------------------------------ */ 1032 /* ------------------------------------------------------------ */
1033 /** 1033 /**
1034 * Loads keystore using an input stream or a file path in the same 1034 * Loads keystore using an input stream or a file path in the same
1035 * order of precedence. 1035 * order of precedence.
1036 * 1036 *
1037 * Required for integrations to be able to override the mechanism 1037 * Required for integrations to be able to override the mechanism
1038 * used to load a keystore in order to provide their own implementation. 1038 * used to load a keystore in order to provide their own implementation.
1039 * 1039 *
1040 * @param storeStream keystore input stream 1040 * @param storeStream keystore input stream
1041 * @param storePath path of keystore file 1041 * @param storePath path of keystore file
1042 * @param storeType keystore type 1042 * @param storeType keystore type
1043 * @param storeProvider keystore provider 1043 * @param storeProvider keystore provider
1044 * @param storePassword keystore password 1044 * @param storePassword keystore password
1045 * @return created keystore 1045 * @return created keystore
1046 * @throws Exception if the keystore cannot be obtained 1046 * @throws Exception if the keystore cannot be obtained
1047 * 1047 *
1048 * @deprecated 1048 * @deprecated
1049 */ 1049 */
1050 @Deprecated 1050 @Deprecated
1051 protected KeyStore getKeyStore(InputStream storeStream, String storePath, String storeType, String storeProvider, String storePassword) throws Exception 1051 protected KeyStore getKeyStore(InputStream storeStream, String storePath, String storeType, String storeProvider, String storePassword) throws Exception
1052 { 1052 {
1053 return CertificateUtils.getKeyStore(storeStream, storePath, storeType, storeProvider, storePassword); 1053 return CertificateUtils.getKeyStore(storeStream, storePath, storeType, storeProvider, storePassword);
1054 } 1054 }
1055 1055
1056 /* ------------------------------------------------------------ */ 1056 /* ------------------------------------------------------------ */
1057 /** 1057 /**
1058 * Loads certificate revocation list (CRL) from a file. 1058 * Loads certificate revocation list (CRL) from a file.
1059 * 1059 *
1060 * Required for integrations to be able to override the mechanism used to 1060 * Required for integrations to be able to override the mechanism used to
1061 * load CRL in order to provide their own implementation. 1061 * load CRL in order to provide their own implementation.
1062 * 1062 *
1063 * @param crlPath path of certificate revocation list file 1063 * @param crlPath path of certificate revocation list file
1064 * @return Collection of CRL's 1064 * @return Collection of CRL's
1065 * @throws Exception if the certificate revocation list cannot be loaded 1065 * @throws Exception if the certificate revocation list cannot be loaded
1066 */ 1066 */
1067 protected Collection<? extends CRL> loadCRL(String crlPath) throws Exception 1067 protected Collection<? extends CRL> loadCRL(String crlPath) throws Exception
1068 { 1068 {
1069 return CertificateUtils.loadCRL(crlPath); 1069 return CertificateUtils.loadCRL(crlPath);
1070 } 1070 }
1071 1071
1072 /* ------------------------------------------------------------ */ 1072 /* ------------------------------------------------------------ */
1073 protected KeyManager[] getKeyManagers(KeyStore keyStore) throws Exception 1073 protected KeyManager[] getKeyManagers(KeyStore keyStore) throws Exception
1074 { 1074 {
1075 KeyManager[] managers = null; 1075 KeyManager[] managers = null;
1076 1076
1077 if (keyStore != null) 1077 if (keyStore != null)
1078 { 1078 {
1079 KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(_keyManagerFactoryAlgorithm); 1079 KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(_keyManagerFactoryAlgorithm);
1080 keyManagerFactory.init(keyStore,_keyManagerPassword == null?(_keyStorePassword == null?null:_keyStorePassword.toString().toCharArray()):_keyManagerPassword.toString().toCharArray()); 1080 keyManagerFactory.init(keyStore,_keyManagerPassword == null?(_keyStorePassword == null?null:_keyStorePassword.toString().toCharArray()):_keyManagerPassword.toString().toCharArray());
1081 managers = keyManagerFactory.getKeyManagers(); 1081 managers = keyManagerFactory.getKeyManagers();
1082 1082
1083 if (_certAlias != null) 1083 if (_certAlias != null)
1084 { 1084 {
1085 for (int idx = 0; idx < managers.length; idx++) 1085 for (int idx = 0; idx < managers.length; idx++)
1086 { 1086 {
1087 if (managers[idx] instanceof X509KeyManager) 1087 if (managers[idx] instanceof X509KeyManager)
1088 { 1088 {
1089 managers[idx] = new AliasedX509ExtendedKeyManager(_certAlias,(X509KeyManager)managers[idx]); 1089 managers[idx] = new AliasedX509ExtendedKeyManager(_certAlias,(X509KeyManager)managers[idx]);
1090 } 1090 }
1091 } 1091 }
1092 } 1092 }
1093 } 1093 }
1094 1094
1095 return managers; 1095 return managers;
1096 } 1096 }
1097 1097
1098 /* ------------------------------------------------------------ */ 1098 /* ------------------------------------------------------------ */
1099 protected TrustManager[] getTrustManagers(KeyStore trustStore, Collection<? extends CRL> crls) throws Exception 1099 protected TrustManager[] getTrustManagers(KeyStore trustStore, Collection<? extends CRL> crls) throws Exception
1100 { 1100 {
1101 TrustManager[] managers = null; 1101 TrustManager[] managers = null;
1102 if (trustStore != null) 1102 if (trustStore != null)
1103 { 1103 {
1104 // Revocation checking is only supported for PKIX algorithm 1104 // Revocation checking is only supported for PKIX algorithm
1105 if (_validatePeerCerts && _trustManagerFactoryAlgorithm.equalsIgnoreCase("PKIX")) 1105 if (_validatePeerCerts && _trustManagerFactoryAlgorithm.equalsIgnoreCase("PKIX"))
1106 { 1106 {
1107 PKIXBuilderParameters pbParams = new PKIXBuilderParameters(trustStore,new X509CertSelector()); 1107 PKIXBuilderParameters pbParams = new PKIXBuilderParameters(trustStore,new X509CertSelector());
1108 1108
1109 // Set maximum certification path length 1109 // Set maximum certification path length
1110 pbParams.setMaxPathLength(_maxCertPathLength); 1110 pbParams.setMaxPathLength(_maxCertPathLength);
1111 1111
1112 // Make sure revocation checking is enabled 1112 // Make sure revocation checking is enabled
1113 pbParams.setRevocationEnabled(true); 1113 pbParams.setRevocationEnabled(true);
1114 1114
1115 if (crls != null && !crls.isEmpty()) 1115 if (crls != null && !crls.isEmpty())
1116 { 1116 {
1117 pbParams.addCertStore(CertStore.getInstance("Collection",new CollectionCertStoreParameters(crls))); 1117 pbParams.addCertStore(CertStore.getInstance("Collection",new CollectionCertStoreParameters(crls)));
1118 } 1118 }
1119 1119
1120 if (_enableCRLDP) 1120 if (_enableCRLDP)
1121 { 1121 {
1122 // Enable Certificate Revocation List Distribution Points (CRLDP) support 1122 // Enable Certificate Revocation List Distribution Points (CRLDP) support
1123 System.setProperty("com.sun.security.enableCRLDP","true"); 1123 System.setProperty("com.sun.security.enableCRLDP","true");
1124 } 1124 }
1125 1125
1126 if (_enableOCSP) 1126 if (_enableOCSP)
1127 { 1127 {
1128 // Enable On-Line Certificate Status Protocol (OCSP) support 1128 // Enable On-Line Certificate Status Protocol (OCSP) support
1129 Security.setProperty("ocsp.enable","true"); 1129 Security.setProperty("ocsp.enable","true");
1130 1130
1131 if (_ocspResponderURL != null) 1131 if (_ocspResponderURL != null)
1132 { 1132 {
1133 // Override location of OCSP Responder 1133 // Override location of OCSP Responder
1134 Security.setProperty("ocsp.responderURL", _ocspResponderURL); 1134 Security.setProperty("ocsp.responderURL", _ocspResponderURL);
1135 } 1135 }
1136 } 1136 }
1137 1137
1138 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(_trustManagerFactoryAlgorithm); 1138 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(_trustManagerFactoryAlgorithm);
1139 trustManagerFactory.init(new CertPathTrustManagerParameters(pbParams)); 1139 trustManagerFactory.init(new CertPathTrustManagerParameters(pbParams));
1140 1140
1141 managers = trustManagerFactory.getTrustManagers(); 1141 managers = trustManagerFactory.getTrustManagers();
1142 } 1142 }
1143 else 1143 else
1144 { 1144 {
1145 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(_trustManagerFactoryAlgorithm); 1145 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(_trustManagerFactoryAlgorithm);
1146 trustManagerFactory.init(trustStore); 1146 trustManagerFactory.init(trustStore);
1147 1147
1148 managers = trustManagerFactory.getTrustManagers(); 1148 managers = trustManagerFactory.getTrustManagers();
1149 } 1149 }
1150 } 1150 }
1151 1151
1152 return managers; 1152 return managers;
1153 } 1153 }
1154 1154
1155 /* ------------------------------------------------------------ */ 1155 /* ------------------------------------------------------------ */
1156 /** 1156 /**
1157 * Check KeyStore Configuration. Ensures that if keystore has been 1157 * Check KeyStore Configuration. Ensures that if keystore has been
1158 * configured but there's no truststore, that keystore is 1158 * configured but there's no truststore, that keystore is
1159 * used as truststore. 1159 * used as truststore.
1160 * @throws IllegalStateException if SslContextFactory configuration can't be used. 1160 * @throws IllegalStateException if SslContextFactory configuration can't be used.
1161 */ 1161 */
1162 public void checkKeyStore() 1162 public void checkKeyStore()
1163 { 1163 {
1164 if (_context != null) 1164 if (_context != null)
1165 return; //nothing to check if using preconfigured context 1165 return; //nothing to check if using preconfigured context
1166 1166
1167 1167
1168 if (_keyStore == null && _keyStoreInputStream == null && _keyStorePath == null) 1168 if (_keyStore == null && _keyStoreInputStream == null && _keyStorePath == null)
1169 throw new IllegalStateException("SSL doesn't have a valid keystore"); 1169 throw new IllegalStateException("SSL doesn't have a valid keystore");
1170 1170
1171 // if the keystore has been configured but there is no 1171 // if the keystore has been configured but there is no
1172 // truststore configured, use the keystore as the truststore 1172 // truststore configured, use the keystore as the truststore
1173 if (_trustStore == null && _trustStoreInputStream == null && _trustStorePath == null) 1173 if (_trustStore == null && _trustStoreInputStream == null && _trustStorePath == null)
1174 { 1174 {
1175 _trustStore = _keyStore; 1175 _trustStore = _keyStore;
1176 _trustStorePath = _keyStorePath; 1176 _trustStorePath = _keyStorePath;
1177 _trustStoreInputStream = _keyStoreInputStream; 1177 _trustStoreInputStream = _keyStoreInputStream;
1178 _trustStoreType = _keyStoreType; 1178 _trustStoreType = _keyStoreType;
1179 _trustStoreProvider = _keyStoreProvider; 1179 _trustStoreProvider = _keyStoreProvider;
1180 _trustStorePassword = _keyStorePassword; 1180 _trustStorePassword = _keyStorePassword;
1181 _trustManagerFactoryAlgorithm = _keyManagerFactoryAlgorithm; 1181 _trustManagerFactoryAlgorithm = _keyManagerFactoryAlgorithm;
1182 } 1182 }
1183 1183
1184 // It's the same stream we cannot read it twice, so read it once in memory 1184 // It's the same stream we cannot read it twice, so read it once in memory
1185 if (_keyStoreInputStream != null && _keyStoreInputStream == _trustStoreInputStream) 1185 if (_keyStoreInputStream != null && _keyStoreInputStream == _trustStoreInputStream)
1186 { 1186 {
1187 try 1187 try
1188 { 1188 {
1189 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 1189 ByteArrayOutputStream baos = new ByteArrayOutputStream();
1190 IO.copy(_keyStoreInputStream, baos); 1190 IO.copy(_keyStoreInputStream, baos);
1191 _keyStoreInputStream.close(); 1191 _keyStoreInputStream.close();
1192 1192
1193 _keyStoreInputStream = new ByteArrayInputStream(baos.toByteArray()); 1193 _keyStoreInputStream = new ByteArrayInputStream(baos.toByteArray());
1194 _trustStoreInputStream = new ByteArrayInputStream(baos.toByteArray()); 1194 _trustStoreInputStream = new ByteArrayInputStream(baos.toByteArray());
1195 } 1195 }
1196 catch (Exception ex) 1196 catch (Exception ex)
1197 { 1197 {
1198 throw new IllegalStateException(ex); 1198 throw new IllegalStateException(ex);
1199 } 1199 }
1200 } 1200 }
1201 } 1201 }
1202 1202
1203 /* ------------------------------------------------------------ */ 1203 /* ------------------------------------------------------------ */
1204 /** 1204 /**
1205 * Select protocols to be used by the connector 1205 * Select protocols to be used by the connector
1206 * based on configured inclusion and exclusion lists 1206 * based on configured inclusion and exclusion lists
1207 * as well as enabled and supported protocols. 1207 * as well as enabled and supported protocols.
1208 * @param enabledProtocols Array of enabled protocols 1208 * @param enabledProtocols Array of enabled protocols
1209 * @param supportedProtocols Array of supported protocols 1209 * @param supportedProtocols Array of supported protocols
1210 * @return Array of protocols to enable 1210 * @return Array of protocols to enable
1211 */ 1211 */
1212 public String[] selectProtocols(String[] enabledProtocols, String[] supportedProtocols) 1212 public String[] selectProtocols(String[] enabledProtocols, String[] supportedProtocols)
1213 { 1213 {
1214 Set<String> selected_protocols = new LinkedHashSet<String>(); 1214 Set<String> selected_protocols = new LinkedHashSet<String>();
1215 1215
1216 // Set the starting protocols - either from the included or enabled list 1216 // Set the starting protocols - either from the included or enabled list
1217 if (_includeProtocols!=null) 1217 if (_includeProtocols!=null)
1218 { 1218 {
1219 // Use only the supported included protocols 1219 // Use only the supported included protocols
1220 for (String protocol : _includeProtocols) 1220 for (String protocol : _includeProtocols)
1221 if(Arrays.asList(supportedProtocols).contains(protocol)) 1221 if(Arrays.asList(supportedProtocols).contains(protocol))
1222 selected_protocols.add(protocol); 1222 selected_protocols.add(protocol);
1223 } 1223 }
1224 else 1224 else
1225 selected_protocols.addAll(Arrays.asList(enabledProtocols)); 1225 selected_protocols.addAll(Arrays.asList(enabledProtocols));
1226 1226
1227 1227
1228 // Remove any excluded protocols 1228 // Remove any excluded protocols
1229 if (_excludeProtocols != null) 1229 if (_excludeProtocols != null)
1230 selected_protocols.removeAll(_excludeProtocols); 1230 selected_protocols.removeAll(_excludeProtocols);
1231 1231
1232 return selected_protocols.toArray(new String[selected_protocols.size()]); 1232 return selected_protocols.toArray(new String[selected_protocols.size()]);
1233 } 1233 }
1234 1234
1235 /* ------------------------------------------------------------ */ 1235 /* ------------------------------------------------------------ */
1236 /** 1236 /**
1237 * Select cipher suites to be used by the connector 1237 * Select cipher suites to be used by the connector
1238 * based on configured inclusion and exclusion lists 1238 * based on configured inclusion and exclusion lists
1239 * as well as enabled and supported cipher suite lists. 1239 * as well as enabled and supported cipher suite lists.
1240 * @param enabledCipherSuites Array of enabled cipher suites 1240 * @param enabledCipherSuites Array of enabled cipher suites
1241 * @param supportedCipherSuites Array of supported cipher suites 1241 * @param supportedCipherSuites Array of supported cipher suites
1242 * @return Array of cipher suites to enable 1242 * @return Array of cipher suites to enable
1243 */ 1243 */
1244 public String[] selectCipherSuites(String[] enabledCipherSuites, String[] supportedCipherSuites) 1244 public String[] selectCipherSuites(String[] enabledCipherSuites, String[] supportedCipherSuites)
1245 { 1245 {
1246 Set<String> selected_ciphers = new LinkedHashSet<String>(); 1246 Set<String> selected_ciphers = new LinkedHashSet<String>();
1247 1247
1248 // Set the starting ciphers - either from the included or enabled list 1248 // Set the starting ciphers - either from the included or enabled list
1249 if (_includeCipherSuites!=null) 1249 if (_includeCipherSuites!=null)
1250 { 1250 {
1251 // Use only the supported included ciphers 1251 // Use only the supported included ciphers
1252 for (String cipherSuite : _includeCipherSuites) 1252 for (String cipherSuite : _includeCipherSuites)
1253 if(Arrays.asList(supportedCipherSuites).contains(cipherSuite)) 1253 if(Arrays.asList(supportedCipherSuites).contains(cipherSuite))
1254 selected_ciphers.add(cipherSuite); 1254 selected_ciphers.add(cipherSuite);
1255 } 1255 }
1256 else 1256 else
1257 selected_ciphers.addAll(Arrays.asList(enabledCipherSuites)); 1257 selected_ciphers.addAll(Arrays.asList(enabledCipherSuites));
1258 1258
1259 1259
1260 // Remove any excluded ciphers 1260 // Remove any excluded ciphers
1261 if (_excludeCipherSuites != null) 1261 if (_excludeCipherSuites != null)
1262 selected_ciphers.removeAll(_excludeCipherSuites); 1262 selected_ciphers.removeAll(_excludeCipherSuites);
1263 return selected_ciphers.toArray(new String[selected_ciphers.size()]); 1263 return selected_ciphers.toArray(new String[selected_ciphers.size()]);
1264 } 1264 }
1265 1265
1266 /* ------------------------------------------------------------ */ 1266 /* ------------------------------------------------------------ */
1267 /** 1267 /**
1268 * Check if the lifecycle has been started and throw runtime exception 1268 * Check if the lifecycle has been started and throw runtime exception
1269 */ 1269 */
1270 protected void checkNotStarted() 1270 protected void checkNotStarted()
1271 { 1271 {
1272 if (isStarted()) 1272 if (isStarted())
1273 throw new IllegalStateException("Cannot modify configuration when "+getState()); 1273 throw new IllegalStateException("Cannot modify configuration when "+getState());
1274 } 1274 }
1275 1275
1276 /* ------------------------------------------------------------ */ 1276 /* ------------------------------------------------------------ */
1277 /** 1277 /**
1278 * @return true if CRL Distribution Points support is enabled 1278 * @return true if CRL Distribution Points support is enabled
1279 */ 1279 */
1280 public boolean isEnableCRLDP() 1280 public boolean isEnableCRLDP()
1281 { 1281 {
1282 return _enableCRLDP; 1282 return _enableCRLDP;
1283 } 1283 }
1284 1284
1285 /* ------------------------------------------------------------ */ 1285 /* ------------------------------------------------------------ */
1286 /** Enables CRL Distribution Points Support 1286 /** Enables CRL Distribution Points Support
1287 * @param enableCRLDP true - turn on, false - turns off 1287 * @param enableCRLDP true - turn on, false - turns off
1288 */ 1288 */
1289 public void setEnableCRLDP(boolean enableCRLDP) 1289 public void setEnableCRLDP(boolean enableCRLDP)
1290 { 1290 {
1291 checkNotStarted(); 1291 checkNotStarted();
1292 1292
1293 _enableCRLDP = enableCRLDP; 1293 _enableCRLDP = enableCRLDP;
1294 } 1294 }
1295 1295
1296 /* ------------------------------------------------------------ */ 1296 /* ------------------------------------------------------------ */
1297 /** 1297 /**
1298 * @return true if On-Line Certificate Status Protocol support is enabled 1298 * @return true if On-Line Certificate Status Protocol support is enabled
1299 */ 1299 */
1300 public boolean isEnableOCSP() 1300 public boolean isEnableOCSP()
1301 { 1301 {
1302 return _enableOCSP; 1302 return _enableOCSP;
1303 } 1303 }
1304 1304
1305 /* ------------------------------------------------------------ */ 1305 /* ------------------------------------------------------------ */
1306 /** Enables On-Line Certificate Status Protocol support 1306 /** Enables On-Line Certificate Status Protocol support
1307 * @param enableOCSP true - turn on, false - turn off 1307 * @param enableOCSP true - turn on, false - turn off
1308 */ 1308 */
1309 public void setEnableOCSP(boolean enableOCSP) 1309 public void setEnableOCSP(boolean enableOCSP)
1310 { 1310 {
1311 checkNotStarted(); 1311 checkNotStarted();
1312 1312
1313 _enableOCSP = enableOCSP; 1313 _enableOCSP = enableOCSP;
1314 } 1314 }
1315 1315
1316 /* ------------------------------------------------------------ */ 1316 /* ------------------------------------------------------------ */
1317 /** 1317 /**
1318 * @return Location of the OCSP Responder 1318 * @return Location of the OCSP Responder
1319 */ 1319 */
1320 public String getOcspResponderURL() 1320 public String getOcspResponderURL()
1321 { 1321 {
1322 return _ocspResponderURL; 1322 return _ocspResponderURL;
1323 } 1323 }
1324 1324
1325 /* ------------------------------------------------------------ */ 1325 /* ------------------------------------------------------------ */
1326 /** Set the location of the OCSP Responder. 1326 /** Set the location of the OCSP Responder.
1327 * @param ocspResponderURL location of the OCSP Responder 1327 * @param ocspResponderURL location of the OCSP Responder
1328 */ 1328 */
1329 public void setOcspResponderURL(String ocspResponderURL) 1329 public void setOcspResponderURL(String ocspResponderURL)
1330 { 1330 {
1331 checkNotStarted(); 1331 checkNotStarted();
1332 1332
1333 _ocspResponderURL = ocspResponderURL; 1333 _ocspResponderURL = ocspResponderURL;
1334 } 1334 }
1335 1335
1336 /* ------------------------------------------------------------ */ 1336 /* ------------------------------------------------------------ */
1337 /** Set the key store. 1337 /** Set the key store.
1338 * @param keyStore the key store to set 1338 * @param keyStore the key store to set
1339 */ 1339 */
1340 public void setKeyStore(KeyStore keyStore) 1340 public void setKeyStore(KeyStore keyStore)
1341 { 1341 {
1342 checkNotStarted(); 1342 checkNotStarted();
1343 1343
1344 _keyStore = keyStore; 1344 _keyStore = keyStore;
1345 } 1345 }
1346 1346
1347 /* ------------------------------------------------------------ */ 1347 /* ------------------------------------------------------------ */
1348 /** Set the trust store. 1348 /** Set the trust store.
1349 * @param trustStore the trust store to set 1349 * @param trustStore the trust store to set
1350 */ 1350 */
1351 public void setTrustStore(KeyStore trustStore) 1351 public void setTrustStore(KeyStore trustStore)
1352 { 1352 {
1353 checkNotStarted(); 1353 checkNotStarted();
1354 1354
1355 _trustStore = trustStore; 1355 _trustStore = trustStore;
1356 } 1356 }
1357 1357
1358 /* ------------------------------------------------------------ */ 1358 /* ------------------------------------------------------------ */
1359 /** Set the key store resource. 1359 /** Set the key store resource.
1360 * @param resource the key store resource to set 1360 * @param resource the key store resource to set
1361 */ 1361 */
1362 public void setKeyStoreResource(Resource resource) 1362 public void setKeyStoreResource(Resource resource)
1363 { 1363 {
1364 checkNotStarted(); 1364 checkNotStarted();
1365 1365
1366 try 1366 try
1367 { 1367 {
1368 _keyStoreInputStream = resource.getInputStream(); 1368 _keyStoreInputStream = resource.getInputStream();
1369 } 1369 }
1370 catch (IOException e) 1370 catch (IOException e)
1371 { 1371 {
1372 throw new InvalidParameterException("Unable to get resource "+ 1372 throw new InvalidParameterException("Unable to get resource "+
1373 "input stream for resource "+resource.toString()); 1373 "input stream for resource "+resource.toString());
1374 } 1374 }
1375 } 1375 }
1376 1376
1377 /* ------------------------------------------------------------ */ 1377 /* ------------------------------------------------------------ */
1378 /** Set the trust store resource. 1378 /** Set the trust store resource.
1379 * @param resource the trust store resource to set 1379 * @param resource the trust store resource to set
1380 */ 1380 */
1381 public void setTrustStoreResource(Resource resource) 1381 public void setTrustStoreResource(Resource resource)
1382 { 1382 {
1383 checkNotStarted(); 1383 checkNotStarted();
1384 1384
1385 try 1385 try
1386 { 1386 {
1387 _trustStoreInputStream = resource.getInputStream(); 1387 _trustStoreInputStream = resource.getInputStream();
1388 } 1388 }
1389 catch (IOException e) 1389 catch (IOException e)
1390 { 1390 {
1391 throw new InvalidParameterException("Unable to get resource "+ 1391 throw new InvalidParameterException("Unable to get resource "+
1392 "input stream for resource "+resource.toString()); 1392 "input stream for resource "+resource.toString());
1393 } 1393 }
1394 } 1394 }
1395 1395
1396 /* ------------------------------------------------------------ */ 1396 /* ------------------------------------------------------------ */
1397 /** 1397 /**
1398 * @return true if SSL Session caching is enabled 1398 * @return true if SSL Session caching is enabled
1399 */ 1399 */
1400 public boolean isSessionCachingEnabled() 1400 public boolean isSessionCachingEnabled()
1401 { 1401 {
1402 return _sessionCachingEnabled; 1402 return _sessionCachingEnabled;
1403 } 1403 }
1404 1404
1405 /* ------------------------------------------------------------ */ 1405 /* ------------------------------------------------------------ */
1406 /** Set the flag to enable SSL Session caching. 1406 /** Set the flag to enable SSL Session caching.
1407 * @param enableSessionCaching the value of the flag 1407 * @param enableSessionCaching the value of the flag
1408 */ 1408 */
1409 public void setSessionCachingEnabled(boolean enableSessionCaching) 1409 public void setSessionCachingEnabled(boolean enableSessionCaching)
1410 { 1410 {
1411 _sessionCachingEnabled = enableSessionCaching; 1411 _sessionCachingEnabled = enableSessionCaching;
1412 } 1412 }
1413 1413
1414 /* ------------------------------------------------------------ */ 1414 /* ------------------------------------------------------------ */
1415 /** Get SSL session cache size. 1415 /** Get SSL session cache size.
1416 * @return SSL session cache size 1416 * @return SSL session cache size
1417 */ 1417 */
1418 public int getSslSessionCacheSize() 1418 public int getSslSessionCacheSize()
1419 { 1419 {
1420 return _sslSessionCacheSize; 1420 return _sslSessionCacheSize;
1421 } 1421 }
1422 1422
1423 /* ------------------------------------------------------------ */ 1423 /* ------------------------------------------------------------ */
1424 /** SEt SSL session cache size. 1424 /** SEt SSL session cache size.
1425 * @param sslSessionCacheSize SSL session cache size to set 1425 * @param sslSessionCacheSize SSL session cache size to set
1426 */ 1426 */
1427 public void setSslSessionCacheSize(int sslSessionCacheSize) 1427 public void setSslSessionCacheSize(int sslSessionCacheSize)
1428 { 1428 {
1429 _sslSessionCacheSize = sslSessionCacheSize; 1429 _sslSessionCacheSize = sslSessionCacheSize;
1430 } 1430 }
1431 1431
1432 /* ------------------------------------------------------------ */ 1432 /* ------------------------------------------------------------ */
1433 /** Get SSL session timeout. 1433 /** Get SSL session timeout.
1434 * @return SSL session timeout 1434 * @return SSL session timeout
1435 */ 1435 */
1436 public int getSslSessionTimeout() 1436 public int getSslSessionTimeout()
1437 { 1437 {
1438 return _sslSessionTimeout; 1438 return _sslSessionTimeout;
1439 } 1439 }
1440 1440
1441 /* ------------------------------------------------------------ */ 1441 /* ------------------------------------------------------------ */
1442 /** Set SSL session timeout. 1442 /** Set SSL session timeout.
1443 * @param sslSessionTimeout SSL session timeout to set 1443 * @param sslSessionTimeout SSL session timeout to set
1444 */ 1444 */
1445 public void setSslSessionTimeout(int sslSessionTimeout) 1445 public void setSslSessionTimeout(int sslSessionTimeout)
1446 { 1446 {
1447 _sslSessionTimeout = sslSessionTimeout; 1447 _sslSessionTimeout = sslSessionTimeout;
1448 } 1448 }
1449 1449
1450 1450
1451 /* ------------------------------------------------------------ */ 1451 /* ------------------------------------------------------------ */
1452 public SSLServerSocket newSslServerSocket(String host,int port,int backlog) throws IOException 1452 public SSLServerSocket newSslServerSocket(String host,int port,int backlog) throws IOException
1453 { 1453 {
1454 SSLServerSocketFactory factory = _context.getServerSocketFactory(); 1454 SSLServerSocketFactory factory = _context.getServerSocketFactory();
1455 1455
1456 SSLServerSocket socket = 1456 SSLServerSocket socket =
1457 (SSLServerSocket) (host==null ? 1457 (SSLServerSocket) (host==null ?
1458 factory.createServerSocket(port,backlog): 1458 factory.createServerSocket(port,backlog):
1459 factory.createServerSocket(port,backlog,InetAddress.getByName(host))); 1459 factory.createServerSocket(port,backlog,InetAddress.getByName(host)));
1460 1460
1461 if (getWantClientAuth()) 1461 if (getWantClientAuth())
1462 socket.setWantClientAuth(getWantClientAuth()); 1462 socket.setWantClientAuth(getWantClientAuth());
1463 if (getNeedClientAuth()) 1463 if (getNeedClientAuth())
1464 socket.setNeedClientAuth(getNeedClientAuth()); 1464 socket.setNeedClientAuth(getNeedClientAuth());
1465 1465
1466 socket.setEnabledCipherSuites(selectCipherSuites( 1466 socket.setEnabledCipherSuites(selectCipherSuites(
1467 socket.getEnabledCipherSuites(), 1467 socket.getEnabledCipherSuites(),
1468 socket.getSupportedCipherSuites())); 1468 socket.getSupportedCipherSuites()));
1469 socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols())); 1469 socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols()));
1470 1470
1471 return socket; 1471 return socket;
1472 } 1472 }
1473 1473
1474 /* ------------------------------------------------------------ */ 1474 /* ------------------------------------------------------------ */
1475 public SSLSocket newSslSocket() throws IOException 1475 public SSLSocket newSslSocket() throws IOException
1476 { 1476 {
1477 SSLSocketFactory factory = _context.getSocketFactory(); 1477 SSLSocketFactory factory = _context.getSocketFactory();
1478 1478
1479 SSLSocket socket = (SSLSocket)factory.createSocket(); 1479 SSLSocket socket = (SSLSocket)factory.createSocket();
1480 1480
1481 if (getWantClientAuth()) 1481 if (getWantClientAuth())
1482 socket.setWantClientAuth(getWantClientAuth()); 1482 socket.setWantClientAuth(getWantClientAuth());
1483 if (getNeedClientAuth()) 1483 if (getNeedClientAuth())
1484 socket.setNeedClientAuth(getNeedClientAuth()); 1484 socket.setNeedClientAuth(getNeedClientAuth());
1485 1485
1486 socket.setEnabledCipherSuites(selectCipherSuites( 1486 socket.setEnabledCipherSuites(selectCipherSuites(
1487 socket.getEnabledCipherSuites(), 1487 socket.getEnabledCipherSuites(),
1488 socket.getSupportedCipherSuites())); 1488 socket.getSupportedCipherSuites()));
1489 socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols())); 1489 socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols()));
1490 1490
1491 return socket; 1491 return socket;
1492 } 1492 }
1493 1493
1494 /* ------------------------------------------------------------ */ 1494 /* ------------------------------------------------------------ */
1495 public SSLEngine newSslEngine(String host,int port) 1495 public SSLEngine newSslEngine(String host,int port)
1496 { 1496 {
1497 SSLEngine sslEngine=isSessionCachingEnabled() 1497 SSLEngine sslEngine=isSessionCachingEnabled()
1498 ?_context.createSSLEngine(host, port) 1498 ?_context.createSSLEngine(host, port)
1499 :_context.createSSLEngine(); 1499 :_context.createSSLEngine();
1500 1500
1501 customize(sslEngine); 1501 customize(sslEngine);
1502 return sslEngine; 1502 return sslEngine;
1503 } 1503 }
1504 1504
1505 /* ------------------------------------------------------------ */ 1505 /* ------------------------------------------------------------ */
1506 public SSLEngine newSslEngine() 1506 public SSLEngine newSslEngine()
1507 { 1507 {
1508 SSLEngine sslEngine=_context.createSSLEngine(); 1508 SSLEngine sslEngine=_context.createSSLEngine();
1509 customize(sslEngine); 1509 customize(sslEngine);
1510 return sslEngine; 1510 return sslEngine;
1511 } 1511 }
1512 1512
1513 /* ------------------------------------------------------------ */ 1513 /* ------------------------------------------------------------ */
1514 public void customize(SSLEngine sslEngine) 1514 public void customize(SSLEngine sslEngine)
1515 { 1515 {
1516 if (getWantClientAuth()) 1516 if (getWantClientAuth())
1517 sslEngine.setWantClientAuth(getWantClientAuth()); 1517 sslEngine.setWantClientAuth(getWantClientAuth());
1518 if (getNeedClientAuth()) 1518 if (getNeedClientAuth())
1519 sslEngine.setNeedClientAuth(getNeedClientAuth()); 1519 sslEngine.setNeedClientAuth(getNeedClientAuth());
1520 1520
1521 sslEngine.setEnabledCipherSuites(selectCipherSuites( 1521 sslEngine.setEnabledCipherSuites(selectCipherSuites(
1522 sslEngine.getEnabledCipherSuites(), 1522 sslEngine.getEnabledCipherSuites(),
1523 sslEngine.getSupportedCipherSuites())); 1523 sslEngine.getSupportedCipherSuites()));
1524 1524
1525 sslEngine.setEnabledProtocols(selectProtocols(sslEngine.getEnabledProtocols(),sslEngine.getSupportedProtocols())); 1525 sslEngine.setEnabledProtocols(selectProtocols(sslEngine.getEnabledProtocols(),sslEngine.getSupportedProtocols()));
1526 } 1526 }
1527 1527
1528 /* ------------------------------------------------------------ */ 1528 /* ------------------------------------------------------------ */
1529 public String toString() 1529 public String toString()
1530 { 1530 {
1531 return String.format("%s@%x(%s,%s)", 1531 return String.format("%s@%x(%s,%s)",
1532 getClass().getSimpleName(), 1532 getClass().getSimpleName(),
1533 hashCode(), 1533 hashCode(),
1534 _keyStorePath, 1534 _keyStorePath,
1535 _trustStorePath); 1535 _trustStorePath);
1536 } 1536 }
1537 } 1537 }