1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.net.ssl;
18
19 import java.security.KeyStoreException;
20 import java.security.NoSuchAlgorithmException;
21 import java.security.UnrecoverableKeyException;
22 import java.util.Arrays;
23
24 import javax.net.ssl.KeyManagerFactory;
25
26 import org.apache.logging.log4j.core.Core;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
29 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
30
31
32
33
34 @Plugin(name = "KeyStore", category = Core.CATEGORY_NAME, printObject = true)
35 public class KeyStoreConfiguration extends AbstractKeyStoreConfiguration {
36
37 private final String keyManagerFactoryAlgorithm;
38
39
40
41
42
43 public KeyStoreConfiguration(final String location,
44 final PasswordProvider passwordProvider,
45 final String keyStoreType,
46 final String keyManagerFactoryAlgorithm) throws StoreConfigurationException {
47 super(location, passwordProvider, keyStoreType);
48 this.keyManagerFactoryAlgorithm = keyManagerFactoryAlgorithm == null ? KeyManagerFactory.getDefaultAlgorithm()
49 : keyManagerFactoryAlgorithm;
50 }
51
52
53
54
55
56
57 public KeyStoreConfiguration(final String location,
58 final char[] password,
59 final String keyStoreType,
60 final String keyManagerFactoryAlgorithm) throws StoreConfigurationException {
61 this(location, new MemoryPasswordProvider(password), keyStoreType, keyManagerFactoryAlgorithm);
62 if (password != null) {
63 Arrays.fill(password, '\0');
64 }
65 }
66
67
68
69
70
71
72 @Deprecated
73 public KeyStoreConfiguration(final String location, final String password, final String keyStoreType,
74 final String keyManagerFactoryAlgorithm) throws StoreConfigurationException {
75 this(location, new MemoryPasswordProvider(password == null ? null : password.toCharArray()), keyStoreType,
76 keyManagerFactoryAlgorithm);
77 }
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 @PluginFactory
94 public static KeyStoreConfiguration createKeyStoreConfiguration(
95
96 @PluginAttribute("location") final String location,
97 @PluginAttribute(value = "password", sensitive = true) final char[] password,
98 @PluginAttribute("passwordEnvironmentVariable") final String passwordEnvironmentVariable,
99 @PluginAttribute("passwordFile") final String passwordFile,
100 @PluginAttribute("type") final String keyStoreType,
101 @PluginAttribute("keyManagerFactoryAlgorithm") final String keyManagerFactoryAlgorithm) throws StoreConfigurationException {
102
103
104 if (password != null && passwordEnvironmentVariable != null && passwordFile != null) {
105 throw new StoreConfigurationException("You MUST set only one of 'password', 'passwordEnvironmentVariable' or 'passwordFile'.");
106 }
107 try {
108
109 PasswordProvider provider = passwordFile != null
110 ? new FilePasswordProvider(passwordFile)
111 : passwordEnvironmentVariable != null
112 ? new EnvironmentPasswordProvider(passwordEnvironmentVariable)
113
114 : new MemoryPasswordProvider(password);
115
116 if (password != null) {
117 Arrays.fill(password, '\0');
118 }
119 return new KeyStoreConfiguration(location, provider, keyStoreType, keyManagerFactoryAlgorithm);
120 } catch (Exception ex) {
121 throw new StoreConfigurationException("Could not configure KeyStore", ex);
122 }
123 }
124
125
126
127
128 public static KeyStoreConfiguration createKeyStoreConfiguration(
129
130 final String location,
131 final char[] password,
132 final String keyStoreType,
133 final String keyManagerFactoryAlgorithm) throws StoreConfigurationException {
134
135 return createKeyStoreConfiguration(location, password, null, null, keyStoreType, keyManagerFactoryAlgorithm);
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149
150 @Deprecated
151 public static KeyStoreConfiguration createKeyStoreConfiguration(
152
153 final String location,
154 final String password,
155 final String keyStoreType,
156 final String keyManagerFactoryAlgorithm) throws StoreConfigurationException {
157
158 return createKeyStoreConfiguration(location,
159 (password == null ? null : password.toCharArray()),
160 keyStoreType,
161 keyManagerFactoryAlgorithm);
162 }
163
164 public KeyManagerFactory initKeyManagerFactory() throws NoSuchAlgorithmException, UnrecoverableKeyException,
165 KeyStoreException {
166 final KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(this.keyManagerFactoryAlgorithm);
167 char[] password = this.getPasswordAsCharArray();
168 try {
169 kmFactory.init(this.getKeyStore(), password);
170 } finally {
171 if (password != null) {
172 Arrays.fill(password, '\0');
173 }
174 }
175 return kmFactory;
176 }
177
178 @Override
179 public int hashCode() {
180 final int prime = 31;
181 int result = super.hashCode();
182 result = prime * result + ((keyManagerFactoryAlgorithm == null) ? 0 : keyManagerFactoryAlgorithm.hashCode());
183 return result;
184 }
185
186 @Override
187 public boolean equals(final Object obj) {
188 if (this == obj) {
189 return true;
190 }
191 if (!super.equals(obj)) {
192 return false;
193 }
194 if (getClass() != obj.getClass()) {
195 return false;
196 }
197 final KeyStoreConfiguration other = (KeyStoreConfiguration) obj;
198 if (keyManagerFactoryAlgorithm == null) {
199 if (other.keyManagerFactoryAlgorithm != null) {
200 return false;
201 }
202 } else if (!keyManagerFactoryAlgorithm.equals(other.keyManagerFactoryAlgorithm)) {
203 return false;
204 }
205 return true;
206 }
207
208 public String getKeyManagerFactoryAlgorithm() {
209 return keyManagerFactoryAlgorithm;
210 }
211 }