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