001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.util.jsse;
018
019 import java.io.IOException;
020 import java.security.GeneralSecurityException;
021 import java.security.KeyStore;
022 import java.security.Security;
023
024 import javax.net.ssl.TrustManager;
025 import javax.net.ssl.TrustManagerFactory;
026
027 import org.slf4j.Logger;
028 import org.slf4j.LoggerFactory;
029
030 public class TrustManagersParameters extends JsseParameters {
031
032 private static final Logger LOG = LoggerFactory.getLogger(TrustManagersParameters.class);
033
034 /**
035 * The key store configuration used to create the {@link KeyStoreParameters} that the
036 * {@link TrustManager}s produced by this object's configuration expose.
037 */
038 protected KeyStoreParameters keyStore;
039
040 /**
041 * The optional provider identifier for the {@link TrustManagerFactory} used to create
042 * the {@link TrustManager}s represented by this object's configuration.
043 */
044 protected String provider;
045
046 /**
047 * The optional algorithm name for the {@link TrustManagerFactory} used to
048 * create the {@link TrustManager}s represented by this object's
049 * configuration. See the <a href=
050 * "http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html"
051 * >Java Secure Socket Extension Reference Guide</a> for information about
052 * standard algorithm names.
053 */
054 protected String algorithm;
055
056 /**
057 * Creates {@link TrustManager}s based on this instance's configuration and the
058 * {@code KeyStore} produced by the configuration returned from
059 * {@link #getKeyStore()}. The {@code KeyManager}s are produced from a
060 * factory created by using the provider and algorithm identifiers returned
061 * by {@link #getProvider()} and {@link #getAlgorithm()}, respectively. If
062 * either of these methods returns null, the default JSSE value is used
063 * instead.
064 *
065 * @return the initialized {@code TrustManager}s
066 * @throws GeneralSecurityException if there is an error creating the
067 * {@code TrustManagers}s or in creating the {@code KeyStore}
068 * @throws IOException if there is an error loading the {@code KeyStore}
069 *
070 * @see KeyStoreParameters#createKeyStore()
071 */
072 public TrustManager[] createTrustManagers() throws GeneralSecurityException, IOException {
073
074 LOG.trace("Creating TrustManager[] from TrustManagersParameters [{}]", this);
075
076 TrustManager[] trustManagers = null;
077
078 if (this.getKeyStore() != null) {
079 String tmfAlgorithm = this.parsePropertyValue(this.getAlgorithm());
080 if (tmfAlgorithm == null) {
081 tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
082 }
083
084 TrustManagerFactory tmf;
085 if (this.getProvider() == null) {
086 tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
087 } else {
088 tmf = TrustManagerFactory.getInstance(tmfAlgorithm, this.parsePropertyValue(this.getProvider()));
089 }
090
091 LOG.debug("TrustManagerFactory [{}] is using provider [{}] and algorithm [{}].",
092 new Object[] {tmf, tmf.getProvider(), tmf.getAlgorithm()});
093
094 KeyStore ks = this.getKeyStore() == null ? null : this.getKeyStore().createKeyStore();
095 tmf.init(ks);
096 trustManagers = tmf.getTrustManagers();
097
098 LOG.debug("TrustManager[] [{}], initialized from TrustManagerFactory [{}].", trustManagers, tmf);
099 }
100
101 return trustManagers;
102 }
103
104 public KeyStoreParameters getKeyStore() {
105 return keyStore;
106 }
107
108 /**
109 * Sets the key store configuration used to create the {@link KeyStoreParameters} that the
110 * {@link TrustManager}s produced by this object's configuration expose.
111 *
112 * @param value the configuration to use
113 */
114 public void setKeyStore(KeyStoreParameters value) {
115 this.keyStore = value;
116 }
117
118 public String getProvider() {
119 return provider;
120 }
121
122 /**
123 * Sets the optional provider identifier for the {@link TrustManagerFactory}
124 * used to create the {@link TrustManager}s represented by this object's
125 * configuration.
126 *
127 * @param value the desired provider identifier or {@code null} to use the
128 * highest priority provider implementing the algorithm
129 *
130 * @see Security#getProviders()
131 */
132 public void setProvider(String value) {
133 this.provider = value;
134 }
135
136 public String getAlgorithm() {
137 return algorithm;
138 }
139
140 /**
141 * Sets optional algorithm name for the {@link TrustManagerFactory} used to create
142 * the {@link TrustManager}s represented by this object's configuration. See the <a href=
143 * "http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html"
144 * >Java Secure Socket Extension Reference Guide</a> for information about
145 * standard algorithm names.
146 *
147 * @param value the desired algorithm or {@code null} to use default
148 *
149 * @see TrustManagerFactory#getDefaultAlgorithm()
150 */
151 public void setAlgorithm(String value) {
152 this.algorithm = value;
153 }
154
155 @Override
156 public String toString() {
157 StringBuilder builder = new StringBuilder();
158 builder.append("TrustManagerType [keyStore=");
159 builder.append(keyStore);
160 builder.append(", provider=");
161 builder.append(provider);
162 builder.append(", algorithm=");
163 builder.append(algorithm);
164 builder.append(", getContext()=");
165 builder.append(getCamelContext());
166 builder.append("]");
167 return builder.toString();
168 }
169 }