Author: markt Date: Sat Jan 30 00:18:19 2016 New Revision: 1727667 URL: http://svn.apache.org/viewvc?rev=1727667&view=rev Log: Fix an NPE in the Manager web application when displaying ciphers for APR/native Align OpenSsl's handling of enabled ciphers/protocols with JSSE
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1727667&r1=1727666&r2=1727667&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat Jan 30 00:18:19 2016 @@ -24,7 +24,9 @@ import java.nio.channels.CompletionHandl import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; @@ -54,6 +56,7 @@ import org.apache.tomcat.util.buf.ByteBu import org.apache.tomcat.util.net.AbstractEndpoint.Acceptor.AcceptorState; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLHostConfig.Type; +import org.apache.tomcat.util.net.openssl.OpenSSLEngine; /** @@ -346,13 +349,32 @@ public class AprEndpoint extends Abstrac if (isSSLEnabled()) { for (SSLHostConfig sslHostConfig : sslHostConfigs.values()) { - for (SSLHostConfigCertificate certificate : sslHostConfig.getCertificates(true)) { + Set<SSLHostConfigCertificate> certificates = sslHostConfig.getCertificates(true); + boolean firstCertificate = true; + for (SSLHostConfigCertificate certificate : certificates) { if (SSLHostConfig.adjustRelativePath(certificate.getCertificateFile()) == null) { // This is required throw new Exception(sm.getString("endpoint.apr.noSslCertFile")); } + if (firstCertificate) { + // TODO: Duplicates code in SSLUtilBase. Consider + // refactoring to reduce duplication + firstCertificate = false; + // Configure the enabled protocols + List<String> enabledProtocols = SSLUtilBase.getEnabled("protocols", log, + true, sslHostConfig.getProtocols(), + OpenSSLEngine.IMPLEMENTED_PROTOCOLS_SET); + sslHostConfig.setEnabledProtocols( + enabledProtocols.toArray(new String[enabledProtocols.size()])); + // Configure the enabled ciphers + List<String> enabledCiphers = SSLUtilBase.getEnabled("ciphers", log, + false, sslHostConfig.getJsseCipherNames(), + OpenSSLEngine.AVAILABLE_CIPHER_SUITES); + sslHostConfig.setEnabledCiphers( + enabledCiphers.toArray(new String[enabledCiphers.size()])); + } } - if (sslHostConfig.getCertificates().size() > 2) { + if (certificates.size() > 2) { // TODO: Can this limitation be removed? throw new Exception(sm.getString("endpoint.apr.tooManyCertFiles")); } @@ -363,7 +385,7 @@ public class AprEndpoint extends Abstrac // Native fallback used if protocols="" value = SSL.SSL_PROTOCOL_ALL; } else { - for (String protocol : sslHostConfig.getProtocols()) { + for (String protocol : sslHostConfig.getEnabledProtocols()) { if (Constants.SSL_PROTO_SSLv2Hello.equalsIgnoreCase(protocol)) { // NO-OP. OpenSSL always supports SSLv2Hello } else if (Constants.SSL_PROTO_SSLv2.equalsIgnoreCase(protocol)) { Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java?rev=1727667&r1=1727666&r2=1727667&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java Sat Jan 30 00:18:19 2016 @@ -45,19 +45,19 @@ public abstract class SSLUtilBase implem Set<String> configuredProtocols = sslHostConfig.getProtocols(); Set<String> implementedProtocols = getImplementedProtocols(); List<String> enabledProtocols = - getEnabled("protocols", true, configuredProtocols, implementedProtocols); + getEnabled("protocols", getLog(), true, configuredProtocols, implementedProtocols); this.enabledProtocols = enabledProtocols.toArray(new String[enabledProtocols.size()]); // Calculate the enabled ciphers List<String> configuredCiphers = sslHostConfig.getJsseCipherNames(); Set<String> implementedCiphers = getImplementedCiphers(); List<String> enabledCiphers = - getEnabled("ciphers", false, configuredCiphers, implementedCiphers); + getEnabled("ciphers", getLog(), false, configuredCiphers, implementedCiphers); this.enabledCiphers = enabledCiphers.toArray(new String[enabledCiphers.size()]); } - private <T> List<T> getEnabled(String name, boolean warnOnSkip, Collection<T> configured, + static <T> List<T> getEnabled(String name, Log log, boolean warnOnSkip, Collection<T> configured, Collection<T> implemented) { List<T> enabled = new ArrayList<>(); @@ -80,19 +80,19 @@ public abstract class SSLUtilBase implem throw new IllegalArgumentException( sm.getString("sslUtilBase.noneSupported", name, configured)); } - if (getLog().isDebugEnabled()) { - getLog().debug(sm.getString("sslUtilBase.active", name, enabled)); + if (log.isDebugEnabled()) { + log.debug(sm.getString("sslUtilBase.active", name, enabled)); } - if (getLog().isDebugEnabled() || warnOnSkip) { + if (log.isDebugEnabled() || warnOnSkip) { if (enabled.size() != configured.size()) { List<T> skipped = new ArrayList<>(); skipped.addAll(configured); skipped.removeAll(enabled); String msg = sm.getString("sslUtilBase.skipped", name, skipped); if (warnOnSkip) { - getLog().warn(msg); + log.warn(msg); } else { - getLog().debug(msg); + log.debug(msg); } } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java?rev=1727667&r1=1727666&r2=1727667&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java Sat Jan 30 00:18:19 2016 @@ -68,7 +68,7 @@ public final class OpenSSLEngine extends private static final SSLException ENGINE_CLOSED = new SSLException(sm.getString("engine.engineClosed")); private static final SSLException ENCRYPTED_PACKET_OVERSIZED = new SSLException(sm.getString("engine.oversizedPacket")); - protected static final Set<String> AVAILABLE_CIPHER_SUITES; + public static final Set<String> AVAILABLE_CIPHER_SUITES; static { final Set<String> availableCipherSuites = new LinkedHashSet<>(128); @@ -122,8 +122,8 @@ public final class OpenSSLEngine extends Constants.SSL_PROTO_TLSv1_1, Constants.SSL_PROTO_TLSv1_2 }; - protected static final Set<String> IMPLEMENTED_PROTOCOLS_SET = - new HashSet<>(Arrays.asList(IMPLEMENTED_PROTOCOLS)); + public static final Set<String> IMPLEMENTED_PROTOCOLS_SET = + Collections.unmodifiableSet(new HashSet<>(Arrays.asList(IMPLEMENTED_PROTOCOLS))); // Header (5) + Data (2^14) + Compression (1024) + Encryption (1024) + MAC (20) + Padding (256) static final int MAX_ENCRYPTED_PACKET_LENGTH = MAX_CIPHERTEXT_LENGTH + 5 + 20 + 256; Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1727667&r1=1727666&r2=1727667&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Sat Jan 30 00:18:19 2016 @@ -78,6 +78,18 @@ </fix> </changelog> </subsection> + <subsection name="Coyote"> + <changelog> + <fix> + Correct a regression in the connector refactoring in 9.0.0.M2 that broke + TLS support for the APR/native connector. (remm) + </fix> + <fix> + Correct an NPE when listing the enabled ciphers (e.g. via the Manager + web application) for a TLS enabled APR/native connector. (markt) + </fix> + </changelog> + </subsection> </section> <section name="Tomcat 9.0.0.M2" rtext="Voting in progress"> <subsection name="Catalina"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org