This is an automated email from the ASF dual-hosted git repository.

markt-asf pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat-native.git


The following commit(s) were added to refs/heads/main by this push:
     new 090fb1ec6 Remove unused SNI support
090fb1ec6 is described below

commit 090fb1ec619e732f404a0379fb5c318cdb331b09
Author: Mark Thomas <[email protected]>
AuthorDate: Thu May 14 15:06:01 2026 +0100

    Remove unused SNI support
    
    SNI support was only used by the APR/native connector which is not
    supported in Native 2.0.x.
---
 native/src/sslcontext.c | 181 ------------------------------------------------
 1 file changed, 181 deletions(-)

diff --git a/native/src/sslcontext.c b/native/src/sslcontext.c
index 463540c27..954bbc7b4 100644
--- a/native/src/sslcontext.c
+++ b/native/src/sslcontext.c
@@ -81,162 +81,6 @@ static apr_status_t ssl_context_cleanup(void *data)
     return APR_SUCCESS;
 }
 
-static jclass    ssl_context_class;
-static jmethodID sni_java_callback;
-
-/* Callback used when OpenSSL receives a client hello with a Server Name
- * Indication extension.
- */
-int ssl_callback_ServerNameIndication(SSL *ssl, int *al, tcn_ssl_ctxt_t *c)
-{
-    /* TODO: Is it better to cache the JNIEnv* during the call to handshake? */
-
-    /* Get the JNI environment for this callback */
-    JavaVM *javavm = tcn_get_java_vm();
-    JNIEnv *env;
-    const char *servername;
-    jstring hostname;
-    jlong original_ssl_context, new_ssl_context;
-    tcn_ssl_ctxt_t *new_c;
-
-    // Continue only if the static method exists
-    if (sni_java_callback == NULL) {
-        return SSL_TLSEXT_ERR_OK;
-    }
-
-    (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
-
-    // Get the host name presented by the client
-    servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
-
-    // Convert to Java compatible parameters ready for the method call
-    hostname = (*env)->NewStringUTF(env, servername);
-    original_ssl_context = P2J(c);
-
-    new_ssl_context = (*env)->CallStaticLongMethod(env,
-                                                   ssl_context_class,
-                                                   sni_java_callback,
-                                                   original_ssl_context,
-                                                   hostname);
-
-    // Delete the local reference as this method is called via callback.
-    // Otherwise local references are only freed once jni method returns.
-    (*env)->DeleteLocalRef(env, hostname);
-
-    if (new_ssl_context != 0 && new_ssl_context != original_ssl_context) {
-        new_c = J2P(new_ssl_context, tcn_ssl_ctxt_t *);
-        SSL_set_SSL_CTX(ssl, new_c->ctx);
-    }
-
-    return SSL_TLSEXT_ERR_OK;
-}
-
-#if !defined(LIBRESSL_VERSION_NUMBER)
-/*
- * This callback function is called when the ClientHello is received.
- */
-int ssl_callback_ClientHello(SSL *ssl, int *al, void *arg)
-{
-    JavaVM *javavm = tcn_get_java_vm();
-    JNIEnv *env;
-    char *servername = NULL;
-    const unsigned char *pos;
-    size_t len, remaining;
-    tcn_ssl_ctxt_t *c = (tcn_ssl_ctxt_t *) arg;
-    apr_pool_t *subpool = NULL;
-
-    (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
-    // Continue only if the static method exists
-    if (sni_java_callback == NULL) {
-        return SSL_CLIENT_HELLO_SUCCESS;
-    }
-
-    /* We can't use SSL_get_servername() at this earliest OpenSSL connection
-     * stage, and there is no SSL_client_hello_get0_servername() provided as
-     * of OpenSSL 1.1.1. So the code below, that extracts the SNI from the
-     * ClientHello's TLS extensions, is taken from some test code in OpenSSL,
-     * i.e. client_hello_select_server_ctx() in "test/handshake_helper.c".
-     */
-
-    /*
-     * The server_name extension was given too much extensibility when it
-     * was written, so parsing the normal case is a bit complex.
-     */
-    if (!SSL_client_hello_get0_ext(ssl, TLSEXT_TYPE_server_name, &pos,
-                                   &remaining)
-            || remaining <= 2)
-        goto give_up;
-
-    /* Extract the length of the supplied list of names. */
-    len = (*(pos++) << 8);
-    len += *(pos++);
-    if (len + 2 != remaining)
-        goto give_up;
-    remaining = len;
-
-    /*
-     * The list in practice only has a single element, so we only consider
-     * the first one.
-     */
-    if (remaining <= 3 || *pos++ != TLSEXT_NAMETYPE_host_name)
-        goto give_up;
-    remaining--;
-
-    /* Now we can finally pull out the byte array with the actual hostname. */
-    len = (*(pos++) << 8);
-    len += *(pos++);
-    if (len + 2 != remaining)
-        goto give_up;
-
-    /* Use the SNI to switch to the relevant vhost, should it differ from
-     * c->base_server.
-     */
-    if (apr_pool_create(&subpool, c->pool) != APR_SUCCESS) {
-        goto give_up;
-    }
-    servername = apr_pstrmemdup(subpool, (const char *)pos, len);
-
-give_up:
-    if (servername != NULL) {
-        jstring hostname;
-        jlong original_ssl_context, new_ssl_context;
-        tcn_ssl_ctxt_t *new_c;
-
-        hostname = (*env)->NewStringUTF(env, servername);
-        original_ssl_context = P2J(c);
-        new_ssl_context = (*env)->CallStaticLongMethod(env,
-                                                   ssl_context_class,
-                                                   sni_java_callback,
-                                                   original_ssl_context,
-                                                   hostname);
-        (*env)->DeleteLocalRef(env, hostname);
-        if (new_ssl_context != 0 && new_ssl_context != original_ssl_context) {
-            SSL_CTX *ctx;
-            new_c = J2P(new_ssl_context, tcn_ssl_ctxt_t *);
-            ctx = SSL_set_SSL_CTX(ssl, new_c->ctx);
-
-            /* Copied from httpd (modules/ssl/ssl_engine_kernel.c) */
-            SSL_set_options(ssl, SSL_CTX_get_options(ctx));
-            SSL_set_min_proto_version(ssl, SSL_CTX_get_min_proto_version(ctx));
-            SSL_set_max_proto_version(ssl, SSL_CTX_get_max_proto_version(ctx));
-            if ((SSL_get_verify_mode(ssl) == SSL_VERIFY_NONE) ||
-                (SSL_num_renegotiations(ssl) == 0)) {
-                SSL_set_verify(ssl, SSL_CTX_get_verify_mode(ctx), 
SSL_CTX_get_verify_callback(ctx));
-            }
-            if (SSL_num_renegotiations(ssl) == 0) {
-                SSL_set_session_id_context(ssl,  &(c->context_id[0]), sizeof 
c->context_id);
-            }
-        }
-    }
-
-    if (subpool != NULL) {
-        apr_pool_destroy(subpool);
-    }
-
-    return SSL_CLIENT_HELLO_SUCCESS;
-}
-#endif
-
 /* Initialize server context */
 TCN_IMPLEMENT_CALL(jlong, SSLContext, make)(TCN_STDARGS, jlong pool,
                                             jint protocol, jint mode)
@@ -374,31 +218,6 @@ TCN_IMPLEMENT_CALL(jlong, SSLContext, make)(TCN_STDARGS, 
jlong pool,
     SSL_CTX_set_default_passwd_cb_userdata(c->ctx, (void 
*)(&tcn_password_callback));
     SSL_CTX_set_info_callback(c->ctx, SSL_callback_handshake);
 
-    /* Cache Java side SNI callback if not already cached */
-    if (ssl_context_class == NULL) {
-        ssl_context_class = (*e)->NewGlobalRef(e, o);
-        sni_java_callback = (*e)->GetStaticMethodID(e, ssl_context_class,
-                                                    "sniCallBack", 
"(JLjava/lang/String;)J");
-        /* Older Tomcat versions may not have this static method */
-        if ( (*e)->ExceptionCheck(e) ) {
-            (*e)->ExceptionClear(e);
-        }
-    }
-
-    /* Set up OpenSSL call back if SNI is provided by the client */
-    SSL_CTX_set_tlsext_servername_callback(c->ctx, 
ssl_callback_ServerNameIndication);
-    SSL_CTX_set_tlsext_servername_arg(c->ctx, c);
-
-#if !defined(LIBRESSL_VERSION_NUMBER)
-    /*
-     * The ClientHello callback also allows to retrieve the SNI, but since it
-     * runs at the earliest possible connection stage we can even set the TLS
-     * protocol version(s) according to the selected (name-based-)vhost, which
-     * is not possible at the SNI callback stage (due to OpenSSL internals).
-     */
-    SSL_CTX_set_client_hello_cb(c->ctx, ssl_callback_ClientHello, c);
-#endif
-
     /*
      * Let us cleanup the ssl context when the pool is destroyed
      */


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to