Skip to content

Commit b33ed81

Browse files
Evict old connections during reconfiguration
Signed-off-by: MichaelMorris <[email protected]>
1 parent 2a45658 commit b33ed81

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public static SslSocketManager getSocketManager(
206206
if (reconnectDelayMillis == 0) {
207207
reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
208208
}
209-
final String name = "TLS:" + host + ':' + port;
209+
final String name = "TLS:" + host + ':' + port + ':' + sslConfig.getId();
210210
return (SslSocketManager) getManager(
211211
name,
212212
new SslFactoryData(

log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfiguration.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
import java.security.KeyStoreException;
2121
import java.security.NoSuchAlgorithmException;
2222
import java.security.UnrecoverableKeyException;
23+
import java.security.cert.X509Certificate;
24+
import java.util.ArrayList;
25+
import java.util.Arrays;
26+
import java.util.Enumeration;
27+
import java.util.List;
2328
import java.util.Objects;
2429
import javax.net.ssl.KeyManager;
2530
import javax.net.ssl.KeyManagerFactory;
@@ -59,6 +64,41 @@ private SslConfiguration(
5964
this.verifyHostName = verifyHostName;
6065
}
6166

67+
/**
68+
* Creates an identifier based on the contents of the SSL configuration.
69+
*
70+
* @return an ID based on the contents of the configuration
71+
*/
72+
public String getId() {
73+
ArrayList<String> hashElements = new ArrayList<>();
74+
addElementsForHashingFromKeyStore(keyStoreConfig, hashElements);
75+
addElementsForHashingFromKeyStore(trustStoreConfig, hashElements);
76+
return String.valueOf(Arrays.hashCode(hashElements.toArray()));
77+
}
78+
79+
private void addElementsForHashingFromKeyStore(
80+
AbstractKeyStoreConfiguration keyStoreConfiguration, ArrayList<String> hashElements) {
81+
final List<String> aliases = new ArrayList<>();
82+
try {
83+
Enumeration<String> aliasEnumeration =
84+
keyStoreConfiguration.getKeyStore().aliases();
85+
while (aliasEnumeration.hasMoreElements()) {
86+
aliases.add(aliasEnumeration.nextElement());
87+
}
88+
aliases.sort(null);
89+
for (final String alias : aliases) {
90+
final X509Certificate certificate =
91+
(X509Certificate) keyStoreConfiguration.getKeyStore().getCertificate(alias);
92+
final String issuer = certificate.getIssuerX500Principal().getName();
93+
final String serialNumber = certificate.getSerialNumber().toString();
94+
hashElements.add(issuer);
95+
hashElements.add(serialNumber);
96+
}
97+
} catch (KeyStoreException e) {
98+
LOGGER.debug("Error encountered reading " + keyStoreConfiguration.getLocation(), e);
99+
}
100+
}
101+
62102
/**
63103
* Clears the secret fields in this object but still allow it to operate normally.
64104
*/

0 commit comments

Comments
 (0)