diff --git a/CHANGES.txt b/CHANGES.txt index b5e7ec7d23..60ea89966f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -26,6 +26,7 @@ * (Windows) fix startup when WMI memory query fails (CASSANDRA-7505) * Anti-compaction proceeds if any part of the repair failed (CASANDRA-7521) Merged from 2.0: + * Warn when SSL certificates have expired (CASSANDRA-7528) * Fix error when doing reversed queries with static columns (CASSANDRA-7490) diff --git a/src/java/org/apache/cassandra/security/SSLFactory.java b/src/java/org/apache/cassandra/security/SSLFactory.java index 73edc050ba..3cb0670be7 100644 --- a/src/java/org/apache/cassandra/security/SSLFactory.java +++ b/src/java/org/apache/cassandra/security/SSLFactory.java @@ -23,6 +23,9 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.security.KeyStore; +import java.security.cert.X509Certificate; +import java.util.Date; +import java.util.Enumeration; import java.util.Set; import javax.net.ssl.KeyManagerFactory; @@ -48,6 +51,8 @@ public final class SSLFactory { private static final Logger logger = LoggerFactory.getLogger(SSLFactory.class); + private static boolean checkedExpiry = false; + public static SSLServerSocket getServerSocket(EncryptionOptions options, InetAddress address, int port) throws IOException { SSLContext ctx = createSSLContext(options, true); @@ -114,6 +119,20 @@ public final class SSLFactory KeyManagerFactory kmf = KeyManagerFactory.getInstance(options.algorithm); KeyStore ks = KeyStore.getInstance(options.store_type); ks.load(ksf, options.keystore_password.toCharArray()); + if (!checkedExpiry) + { + for (Enumeration aliases = ks.aliases(); aliases.hasMoreElements(); ) + { + String alias = aliases.nextElement(); + if (ks.getCertificate(alias).getType().equals("X.509")) + { + Date expires = ((X509Certificate) ks.getCertificate(alias)).getNotAfter(); + if (expires.before(new Date())) + logger.warn("Certificate for {} expired on {}", alias, expires); + } + } + checkedExpiry = true; + } kmf.init(ks, options.keystore_password.toCharArray()); ctx.init(kmf.getKeyManagers(), trustManagers, null);