diff --git a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslClientContext.java b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslClientContext.java index 626a3a217d..0aff7e7ca0 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslClientContext.java +++ b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslClientContext.java @@ -33,7 +33,6 @@ import java.util.Set; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLException; -import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509ExtendedTrustManager; import javax.net.ssl.X509TrustManager; @@ -276,10 +275,7 @@ public final class ReferenceCountedOpenSslClientContext extends ReferenceCounted keyManagerHolder.setKeyMaterialClientSide(engine, keyTypes, issuers); } catch (Throwable cause) { logger.debug("request of key failed", cause); - SSLHandshakeException e = new SSLHandshakeException("General OpenSslEngine problem"); - e.initCause(cause); - assert engine.handshakeException == null; - engine.handshakeException = e; + engine.initHandshakeException(cause); } } diff --git a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslContext.java b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslContext.java index 3430257912..6b92ad64cf 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslContext.java +++ b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslContext.java @@ -662,10 +662,7 @@ public abstract class ReferenceCountedOpenSslContext extends SslContext implemen return CertificateVerifier.X509_V_OK; } catch (Throwable cause) { logger.debug("verification of certificate failed", cause); - SSLHandshakeException e = new SSLHandshakeException("General OpenSslEngine problem"); - e.initCause(cause); - assert engine.handshakeException == null; - engine.handshakeException = e; + engine.initHandshakeException(cause); // Try to extract the correct error code that should be used. if (cause instanceof OpenSslCertificateException) { diff --git a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java index 2d49e22b6d..e5d6fc9869 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java +++ b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java @@ -224,10 +224,7 @@ public class ReferenceCountedOpenSslEngine extends SSLEngine implements Referenc private final boolean enableOcsp; private int maxWrapOverhead; private int maxWrapBufferSize; - - // This is package-private as we set it from OpenSslContext if an exception is thrown during - // the verification step. - SSLHandshakeException handshakeException; + private Throwable handshakeException; /** * Create a new instance. @@ -1690,11 +1687,25 @@ public class ReferenceCountedOpenSslEngine extends SSLEngine implements Referenc return NEED_WRAP; } - SSLHandshakeException exception = handshakeException; + Throwable exception = handshakeException; assert exception != null; handshakeException = null; shutdown(); - throw exception; + if (exception instanceof SSLHandshakeException) { + throw (SSLHandshakeException) exception; + } + SSLHandshakeException e = new SSLHandshakeException("General OpenSslEngine problem"); + e.initCause(exception); + throw e; + } + + /** + * Should be called if the handshake will be failed due a callback that throws an exception. + * This cause will then be used to give more details as part of the {@link SSLHandshakeException}. + */ + final void initHandshakeException(Throwable cause) { + assert handshakeException == null; + handshakeException = cause; } private SSLEngineResult.HandshakeStatus handshake() throws SSLException { diff --git a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslServerContext.java b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslServerContext.java index 1f9f455bc4..c0d91463f4 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslServerContext.java +++ b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslServerContext.java @@ -29,7 +29,6 @@ import java.security.PrivateKey; import java.security.cert.X509Certificate; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLException; -import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509ExtendedTrustManager; import javax.net.ssl.X509TrustManager; @@ -208,10 +207,7 @@ public final class ReferenceCountedOpenSslServerContext extends ReferenceCounted keyManagerHolder.setKeyMaterialServerSide(engine); } catch (Throwable cause) { logger.debug("Failed to set the server-side key material", cause); - SSLHandshakeException e = new SSLHandshakeException("General OpenSslEngine problem"); - e.initCause(cause); - assert engine.handshakeException == null; - engine.handshakeException = e; + engine.initHandshakeException(cause); } } }