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

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


The following commit(s) were added to refs/heads/main by this push:
     new 9e9d3a89b3 Fix edge case with long certificate chain
9e9d3a89b3 is described below

commit 9e9d3a89b349f4fc52c41cf94c61175ce286ba56
Author: remm <[email protected]>
AuthorDate: Mon Sep 21 14:43:51 2026 +0200

    Fix edge case with long certificate chain
    
    PR#1070
    Submitted by Lukas Hellebrandt
---
 .../tomcat/util/net/openssl/OpenSSLEngine.java     |  22 ++
 .../util/net/openssl/panama/OpenSSLEngine.java     |  22 ++
 test/org/apache/tomcat/util/net/TestSsl.java       |  86 +++++
 test/org/apache/tomcat/util/net/TesterSupport.java |   3 +
 .../tomcat/util/net/generate-longchain-certs.sh    |  62 ++++
 .../util/net/localhost-rsa-longchain-cert.pem      | 213 +++++++++++
 .../util/net/localhost-rsa-longchain-chain.pem     | 398 +++++++++++++++++++++
 .../util/net/localhost-rsa-longchain-key.pem       | 100 ++++++
 webapps/docs/changelog.xml                         |   7 +
 9 files changed, 913 insertions(+)

diff --git a/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java 
b/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
index 40b5a914bd..1351dc1051 100644
--- a/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
+++ b/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
@@ -471,6 +471,13 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
                 shutdown();
             }
 
+            // The network BIO has just been drained. Give OpenSSL the 
opportunity to write out any part of the
+            // current handshake flight that it did not previously have space 
for, before the handshake status is
+            // calculated below.
+            if (!handshakeFinished && !engineClosed) {
+                continueHandshake();
+            }
+
             return new SSLEngineResult(getEngineStatus(), 
getHandshakeStatus(), 0, bytesProduced);
         }
 
@@ -919,6 +926,21 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
         }
     }
 
+    /*
+     * Continue a handshake that is already in progress.
+     *
+     * OpenSSL writes a complete handshake flight to the network BIO in a 
single operation. If the flight does not fit
+     * in the buffer of the BIO pair, the remainder is retained inside OpenSSL 
and can only be written once the BIO has
+     * been drained, which requires OpenSSL to be driven again. Unlike 
handshake(), this method does not reset the
+     * handshake tracking state, so completion continues to be detected via 
the handshake counter.
+     */
+    private void continueHandshake() throws SSLException {
+        clearLastError();
+        if (SSL.doHandshake(state.ssl) <= 0) {
+            checkLastError();
+        }
+    }
+
     private synchronized void renegotiate() throws SSLException {
         clearLastError();
         int code;
diff --git a/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java 
b/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
index 6d747108f5..b7534bebd2 100644
--- a/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
+++ b/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
@@ -391,6 +391,13 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
                 shutdown();
             }
 
+            // The network BIO has just been drained. Give OpenSSL the 
opportunity to write out any part of the
+            // current handshake flight that it did not previously have space 
for, before the handshake status is
+            // calculated below.
+            if (!handshakeFinished && !engineClosed) {
+                continueHandshake();
+            }
+
             return new SSLEngineResult(getEngineStatus(), 
getHandshakeStatus(), 0, bytesProduced);
         }
 
@@ -911,6 +918,21 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
         }
     }
 
+    /*
+     * Continue a handshake that is already in progress.
+     *
+     * OpenSSL writes a complete handshake flight to the network BIO in a 
single operation. If the flight does not fit
+     * in the buffer of the BIO pair, the remainder is retained inside OpenSSL 
and can only be written once the BIO has
+     * been drained, which requires OpenSSL to be driven again. Unlike 
handshake(), this method does not reset the
+     * handshake tracking state, so completion continues to be detected via 
the handshake counter.
+     */
+    private void continueHandshake() throws SSLException {
+        clearLastError();
+        if (SSL_do_handshake(state.ssl) <= 0) {
+            checkLastError();
+        }
+    }
+
     private void renegotiate() throws SSLException {
         if (log.isTraceEnabled()) {
             log.trace("Start renegotiate");
diff --git a/test/org/apache/tomcat/util/net/TestSsl.java 
b/test/org/apache/tomcat/util/net/TestSsl.java
index d965b81fcd..9602fd7b46 100644
--- a/test/org/apache/tomcat/util/net/TestSsl.java
+++ b/test/org/apache/tomcat/util/net/TestSsl.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.Reader;
+import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,16 +31,20 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.net.SocketFactory;
 import javax.net.ssl.HandshakeCompletedEvent;
 import javax.net.ssl.HandshakeCompletedListener;
+import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SNIHostName;
 import javax.net.ssl.SNIServerName;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLParameters;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
 
 import jakarta.servlet.ServletException;
 import jakarta.servlet.SessionTrackingMode;
@@ -126,6 +131,87 @@ public class TestSsl extends TomcatBaseTest {
                 TesterSupport.getLastClientAuthRequestedIssuerCount() == 0);
     }
 
+
+    /*
+     * The certificate chain used by this test is deliberately large. It 
consists of an RSA 8192 leaf, six
+     * intermediates and a root so the certificate message alone is a little 
over 20KiB. That means the first flight
+     * of handshake messages sent by the server does not fit in the 17408 byte 
buffer used by the BIO pair of the
+     * OpenSSL based engines. The chain is kept to eight certificates because 
the default value of
+     * jdk.tls.maxCertificateChainLength limits the client to ten.
+     *
+     * TLSv1.2 is used because the client must not send anything between the 
ClientHello and the completion of the
+     * server's first flight. A TLSv1.3 client normally sends a change cipher 
spec record before then. That allows
+     * unwrap() to be called and the priming read it performs has the side 
effect of flushing the remainder of the
+     * flight, which hides the problem this test is checking for.
+     */
+    @Test
+    public void testLargeCertificateChain() throws Exception {
+        AtomicReference<X509Certificate[]> serverChain = new 
AtomicReference<>();
+        X509TrustManager trustManager = new X509TrustManager() {
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[0];
+            }
+            @Override
+            public void checkClientTrusted(X509Certificate[] chain, String 
authType) {
+                // NO-OP - trust everything
+            }
+            @Override
+            public void checkServerTrusted(X509Certificate[] chain, String 
authType) {
+                // Trust everything but retain the chain so its size can be 
checked below
+                serverChain.set(chain);
+            }
+        };
+        SSLContext sc = SSLContext.getInstance(Constants.SSL_PROTO_TLSv1_2);
+        sc.init(null, new TrustManager[] { trustManager }, null);
+        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+
+        Tomcat tomcat = getTomcatInstance();
+
+        Context ctxt = getProgrammaticRootContext();
+        Tomcat.addServlet(ctxt, "TesterServlet", new TesterServlet());
+        ctxt.addServletMapping("/", "TesterServlet");
+
+        Connector connector = tomcat.getConnector();
+        connector.setSecure(true);
+        Assert.assertTrue(connector.setProperty("SSLEnabled", "true"));
+
+        SSLHostConfig sslHostConfig = new SSLHostConfig();
+        SSLHostConfigCertificate certificate = new 
SSLHostConfigCertificate(sslHostConfig, Type.RSA);
+        certificate.setCertificateFile(new 
File(TesterSupport.LOCALHOST_RSA_LONGCHAIN_CERT_PEM).getAbsolutePath());
+        certificate.setCertificateKeyFile(new 
File(TesterSupport.LOCALHOST_RSA_LONGCHAIN_KEY_PEM).getAbsolutePath());
+        certificate.setCertificateChainFile(
+                new 
File(TesterSupport.LOCALHOST_RSA_LONGCHAIN_CHAIN_PEM).getAbsolutePath());
+        sslHostConfig.addCertificate(certificate);
+        connector.addSslHostConfig(sslHostConfig);
+
+        TesterSupport.configureSSLImplementation(tomcat, 
sslImplementationName, useOpenSSL);
+
+        tomcat.start();
+
+        /*
+         * The failure mode is a stalled handshake so use a read timeout that 
is significantly shorter than the
+         * default to avoid a long delay before the test fails.
+         */
+        ByteChunk res = new ByteChunk();
+        int rc = getUrl("https://localhost:"; + getPort() + "/", res, 30_000, 
null, null);
+
+        Assert.assertEquals(HttpServletResponse.SC_OK, rc);
+        Assert.assertEquals("OK", res.toString());
+
+        /*
+         * Confirm that the server really did send a certificate chain large 
enough to overflow the buffer of the BIO
+         * pair. Without this the test could silently stop testing anything if 
the chain were ever regenerated.
+         */
+        int chainLength = 0;
+        for (X509Certificate cert : serverChain.get()) {
+            chainLength += cert.getEncoded().length;
+        }
+        Assert.assertTrue("Certificate chain of [" + chainLength + "] bytes is 
too small to test this",
+                chainLength > 17408);
+    }
+
+
     private static final int POST_DATA_SIZE = 16 * 1024 * 1024;
     private static final byte[] POST_DATA;
     static {
diff --git a/test/org/apache/tomcat/util/net/TesterSupport.java 
b/test/org/apache/tomcat/util/net/TesterSupport.java
index 738e344193..3592567592 100644
--- a/test/org/apache/tomcat/util/net/TesterSupport.java
+++ b/test/org/apache/tomcat/util/net/TesterSupport.java
@@ -99,6 +99,9 @@ public final class TesterSupport {
     public static final String LOCALHOST_EC_KEY_PEM = SSL_DIR + 
"localhost-ec-key.pem";
     public static final String LOCALHOST_RSA_CERT_PEM = SSL_DIR + 
"localhost-rsa-cert.pem";
     public static final String LOCALHOST_RSA_KEY_PEM = SSL_DIR + 
"localhost-rsa-key.pem";
+    public static final String LOCALHOST_RSA_LONGCHAIN_CERT_PEM = SSL_DIR + 
"localhost-rsa-longchain-cert.pem";
+    public static final String LOCALHOST_RSA_LONGCHAIN_KEY_PEM = SSL_DIR + 
"localhost-rsa-longchain-key.pem";
+    public static final String LOCALHOST_RSA_LONGCHAIN_CHAIN_PEM = SSL_DIR + 
"localhost-rsa-longchain-chain.pem";
     public static final String DB_INDEX = SSL_DIR + "index.db";
     public static final String OCSP_RESPONDER_RSA_CERT = SSL_DIR + 
"ocsp-responder-rsa-cert.pem";
     public static final String OCSP_RESPONDER_RSA_KEY = SSL_DIR + 
"ocsp-responder-rsa-key.pem";
diff --git a/test/org/apache/tomcat/util/net/generate-longchain-certs.sh 
b/test/org/apache/tomcat/util/net/generate-longchain-certs.sh
new file mode 100755
index 0000000000..6c115752c4
--- /dev/null
+++ b/test/org/apache/tomcat/util/net/generate-longchain-certs.sh
@@ -0,0 +1,62 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# generate big cert chain - see bug 70236
+
+set -eu
+
+DAYS=7300
+SUBJECT_PREFIX="/C=US/ST=CA/L=Springfield/O=Apache Software 
Foundation/OU=Apache Tomcat"
+
+newkey() {
+    openssl genrsa -out "$1.key" 8192 2>/dev/null
+}
+
+# Self-signed root CA
+newkey root
+openssl req -x509 -new -key root.key -out root.crt -days $DAYS -sha256 \
+    -subj "$SUBJECT_PREFIX/CN=Apache Tomcat Test Long Chain Root" \
+    -addext "basicConstraints=critical,CA:TRUE" \
+    -addext "keyUsage=critical,keyCertSign,cRLSign"
+
+# Six intermediates, i01 signed by the root, i02 by i01, and so on
+PREV=root
+for N in 01 02 03 04 05 06; do
+    newkey "i$N"
+    openssl req -new -key "i$N.key" -out "i$N.csr" \
+        -subj "$SUBJECT_PREFIX/CN=Apache Tomcat Test Long Chain Intermediate 
$N"
+    openssl x509 -req -in "i$N.csr" -CA "$PREV.crt" -CAkey "$PREV.key" 
-CAcreateserial \
+        -out "i$N.crt" -days $DAYS -sha256 \
+        -extfile <(printf 
'basicConstraints=critical,CA:TRUE\nkeyUsage=critical,keyCertSign,cRLSign\n')
+    PREV="i$N"
+done
+
+# Leaf, signed by the last intermediate (i06)
+newkey leaf
+openssl req -new -key leaf.key -out leaf.csr -subj 
"$SUBJECT_PREFIX/CN=localhost"
+openssl x509 -req -in leaf.csr -CA i06.crt -CAkey i06.key -CAcreateserial \
+    -out leaf.crt -days $DAYS -sha256 \
+    -extfile <(printf '%s\n' \
+        "basicConstraints=critical,CA:FALSE" \
+        "keyUsage=critical,digitalSignature,keyEncipherment" \
+        "extendedKeyUsage=serverAuth" \
+        "subjectAltName=DNS:localhost,IP:127.0.0.1")
+
+# Assemble the outputs used by TesterSupport / TestSsl
+openssl x509 -in leaf.crt -text > localhost-rsa-longchain-cert.pem
+cp leaf.key localhost-rsa-longchain-key.pem
+cat i06.crt i05.crt i04.crt i03.crt i02.crt i01.crt root.crt > 
localhost-rsa-longchain-chain.pem
+
+echo "Wrote localhost-rsa-longchain-cert.pem, localhost-rsa-longchain-key.pem, 
localhost-rsa-longchain-chain.pem"
diff --git a/test/org/apache/tomcat/util/net/localhost-rsa-longchain-cert.pem 
b/test/org/apache/tomcat/util/net/localhost-rsa-longchain-cert.pem
new file mode 100644
index 0000000000..216595d3f2
--- /dev/null
+++ b/test/org/apache/tomcat/util/net/localhost-rsa-longchain-cert.pem
@@ -0,0 +1,213 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 153 (0x99)
+        Signature Algorithm: sha256WithRSAEncryption
+        Issuer: C=US, ST=CA, L=Springfield, O=Apache Software Foundation, 
OU=Apache Tomcat, CN=Apache Tomcat Test Long Chain Intermediate 06
+        Validity
+            Not Before: Sep 18 09:13:02 2026 GMT
+            Not After : Sep 13 09:13:02 2046 GMT
+        Subject: C=US, ST=CA, L=Springfield, O=Apache Software Foundation, 
OU=Apache Tomcat, CN=localhost
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (8192 bit)
+                Modulus:
+                    00:a3:3b:07:c0:7c:54:03:bd:ba:f2:f4:ba:62:06:
+                    6d:31:8e:c4:24:b9:9c:14:f1:f5:93:52:b9:41:f4:
+                    49:64:4d:8a:48:13:64:00:60:e3:48:c6:ac:bd:c6:
+                    94:7f:25:e4:bc:10:ee:1c:12:7f:89:ac:a0:01:46:
+                    77:21:df:43:9a:6b:84:21:d3:32:1e:70:c5:d2:12:
+                    2f:65:91:1e:37:cd:4b:db:7c:cc:cd:07:0f:e0:52:
+                    e0:96:07:4c:61:cb:a5:ee:23:9a:23:9d:52:2e:97:
+                    2f:f1:8a:1f:e8:dd:ea:35:5e:bd:3f:03:18:a5:b2:
+                    f8:b2:1d:a1:e8:29:7d:a6:f2:3f:4d:89:28:d4:f1:
+                    44:30:e5:cf:73:99:d8:34:b3:ba:ed:ef:5e:04:bd:
+                    ae:d5:5a:59:65:45:58:b8:86:96:f1:ac:d3:4a:55:
+                    22:01:57:63:47:54:32:be:3b:29:16:a9:4b:d5:fe:
+                    9d:1d:2d:b7:43:9c:c6:76:15:c4:a8:ec:07:08:d6:
+                    99:b2:4c:62:1f:fa:64:82:8c:20:c2:61:82:ef:1f:
+                    86:08:1b:5c:99:d4:b1:1f:e8:26:df:52:3f:b9:5a:
+                    2f:30:32:9c:df:ae:0b:17:25:66:1f:8a:b4:eb:89:
+                    40:54:6a:79:30:14:82:57:c3:60:63:2a:46:93:a8:
+                    11:79:d9:01:97:fa:c1:5a:72:e9:ac:e2:25:f1:ba:
+                    90:4f:15:11:14:9c:e0:a4:91:e4:21:ad:84:5b:68:
+                    6c:a9:28:ee:6f:f6:47:be:9a:6a:e7:03:68:33:2b:
+                    3f:7f:22:2f:0a:e7:04:52:e8:94:cc:8c:50:af:d9:
+                    a4:01:35:ea:65:93:56:34:0a:b3:45:98:bc:3f:38:
+                    4d:00:5a:6a:0c:65:75:65:25:7f:93:c4:b7:60:f6:
+                    04:e3:17:4c:a3:55:80:ac:7c:88:fb:6b:c6:a2:0b:
+                    a9:c9:61:42:e8:09:d6:3f:70:03:8c:66:ae:7c:49:
+                    7e:f7:32:85:f2:9f:af:83:37:df:17:5c:3f:a0:34:
+                    1a:c0:c1:2c:f8:b1:97:0a:d9:f8:44:0e:5b:1c:7f:
+                    cb:e8:b0:ea:ab:a6:88:3d:32:c6:40:de:04:d0:6e:
+                    98:ca:c0:69:30:7a:bb:c6:3b:f1:1e:92:72:7f:11:
+                    66:f8:b1:a9:72:47:f8:09:44:f9:42:56:2b:77:c2:
+                    fc:2e:36:3b:f8:b3:fb:c2:43:88:ca:79:bf:7f:5b:
+                    62:6f:13:e0:ab:9f:8f:11:ac:fd:0c:2c:6e:89:92:
+                    de:5c:5b:93:3b:b6:bc:b2:06:cd:f1:f9:8b:0a:44:
+                    03:0c:01:27:5e:85:e8:c4:34:d3:dc:29:80:b4:2b:
+                    bd:e4:05:88:ab:af:20:da:cc:d6:83:e5:e9:05:43:
+                    e8:2b:5d:ed:54:5f:67:36:09:4f:23:0d:02:bc:e0:
+                    a5:38:55:4e:c9:49:c5:c1:97:ad:94:95:a6:e2:4f:
+                    6c:d4:eb:da:62:ad:1a:57:98:24:29:08:a5:e7:39:
+                    5e:a7:83:df:24:ca:8a:3d:f9:ea:3b:ee:53:bf:56:
+                    91:39:0a:a0:94:e4:e8:59:f9:a4:9b:1b:8a:62:21:
+                    20:de:5e:cc:26:4b:16:5b:79:1d:7c:4f:6f:70:3b:
+                    6a:1e:92:89:f9:60:f4:d8:b8:d9:34:d2:9a:73:35:
+                    5c:48:03:ed:b1:5f:5b:9d:e2:b9:82:da:1d:de:cb:
+                    ac:c3:c5:ab:13:9a:5b:1f:d3:5f:cf:e0:38:1c:c3:
+                    cd:e7:7d:df:94:59:06:44:03:cd:bd:3c:2a:3a:60:
+                    84:9a:47:1f:5f:a9:ec:ad:bc:5c:e0:d8:2d:5b:f8:
+                    60:aa:04:2c:31:19:cc:98:5d:12:49:9a:87:80:b1:
+                    d8:dd:92:08:a4:46:35:ba:f9:8d:7a:ad:9a:69:c1:
+                    6a:1c:63:11:c4:a2:1c:63:9b:73:88:49:7a:d2:0d:
+                    32:d3:58:e1:e3:48:b4:f1:78:25:7d:90:7e:69:65:
+                    77:13:80:c9:71:58:6e:8d:d3:f1:b7:b7:2b:98:18:
+                    d1:ca:9a:ab:af:78:f6:aa:19:22:2c:c0:24:4f:04:
+                    c8:0b:7b:37:24:85:dc:fb:7a:63:c0:09:3b:21:a6:
+                    e0:87:d1:a1:6b:05:5d:d6:dd:13:70:ce:47:c3:b7:
+                    63:dd:86:29:7e:8b:e8:f6:8e:29:08:ad:44:e9:1e:
+                    6f:70:55:e6:47:bf:46:31:26:6f:83:68:8c:2a:94:
+                    5a:20:91:a4:78:b1:1b:c1:e5:25:d5:12:cd:cd:bb:
+                    ec:6b:3d:e4:14:02:d6:4f:2d:78:d0:85:ad:3a:f0:
+                    27:de:30:f3:54:f4:26:48:5f:31:6c:5d:c7:4e:9f:
+                    2a:71:f5:a2:ec:2f:6d:8d:82:f8:8a:7b:97:00:b7:
+                    84:71:c4:47:02:3e:df:fb:44:e3:e2:82:78:ee:d0:
+                    60:c0:40:fd:6d:6c:19:0a:1e:29:8b:89:f8:66:58:
+                    7b:1e:45:b9:00:0a:de:22:f1:be:4d:83:10:f1:a1:
+                    2e:10:a6:b9:57:f8:8e:bb:d2:3e:2b:3e:d3:09:7f:
+                    7f:dd:8b:bf:07:2a:65:97:76:2b:60:bd:5c:4a:cb:
+                    58:cc:d5:cc:43:b3:b0:84:5d:ff:c5:60:93:0c:6a:
+                    de:34:99:97:e3:19:86:41:b9:fe:73:2b:e8:d6:4f:
+                    d8:e9:91:f8:a2:51:c2:73:d2:1b:b4:cd:c5:f0:ec:
+                    31:a4:e0:75:63
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: critical
+                CA:FALSE
+            X509v3 Key Usage: critical
+                Digital Signature, Key Encipherment
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:localhost, IP Address:127.0.0.1
+            X509v3 Subject Key Identifier: 
+                21:E9:F6:88:97:9C:39:30:7A:46:D3:9D:63:B1:70:2F:9E:99:FD:49
+            X509v3 Authority Key Identifier: 
+                FB:BC:78:16:4E:2C:CA:80:D0:D7:FA:2E:10:C3:73:E5:C1:2F:96:0E
+    Signature Algorithm: sha256WithRSAEncryption
+    Signature Value:
+        9d:62:f3:5f:29:ee:b0:50:b9:52:a7:70:ed:96:dd:40:d6:5e:
+        27:cb:d3:ac:c4:11:04:44:66:83:a2:fc:3e:24:df:78:84:df:
+        48:f1:b5:cb:47:c7:ca:e4:e2:90:ec:ff:94:77:37:2b:0e:73:
+        01:db:69:23:0f:a7:f7:ba:7f:97:79:76:5d:0c:78:9c:0d:09:
+        c8:2a:26:61:64:4d:0c:17:60:24:88:55:76:87:6b:d1:99:8c:
+        4a:fc:4a:1a:99:1a:1a:21:ce:c9:24:10:70:7a:19:08:53:ef:
+        ba:6b:f3:8b:e6:63:74:42:79:c5:68:c6:4a:94:0a:96:33:13:
+        96:14:15:df:d1:15:4f:c3:84:b1:3c:7f:dd:fe:bd:73:12:dc:
+        00:0f:cb:c7:d3:fb:39:03:26:5e:cb:51:e4:e9:ff:b1:57:51:
+        d0:bc:ca:3c:89:ed:bc:48:de:1a:c3:7a:97:12:69:6a:3a:3e:
+        70:b1:a9:5c:02:a6:1d:37:74:34:b0:96:05:1d:a8:61:51:dd:
+        0c:29:ba:ed:97:48:b5:b3:60:0c:bd:97:ca:86:7f:b4:8b:94:
+        5a:15:b3:ad:52:55:2e:38:d3:ac:98:9f:46:01:c2:17:e5:0a:
+        e8:a8:59:a7:78:86:70:5d:36:09:25:77:67:06:b5:97:8d:16:
+        05:d9:77:12:d0:1b:d4:a0:1d:ea:4b:42:55:b7:37:3a:4a:e8:
+        f1:97:fb:90:09:3f:32:80:8b:c3:6e:78:d7:03:72:89:d9:e6:
+        4f:7f:81:71:ac:4e:18:1e:ef:5e:36:8b:80:0e:9c:82:a9:57:
+        66:27:f5:fd:4e:04:36:e5:91:d1:58:4d:13:92:59:de:c0:a9:
+        55:45:c5:7e:6b:b3:b4:19:a2:cc:14:32:2c:72:61:0a:ce:b2:
+        98:c8:64:05:8a:9c:ed:96:f6:20:cf:71:1b:14:89:e5:90:39:
+        8e:75:99:62:8a:49:be:ab:61:85:33:80:82:e4:00:49:d6:60:
+        12:e2:24:4b:63:d0:54:d8:61:6d:e7:75:6c:9b:73:3c:84:8c:
+        33:4b:f6:6f:4e:bb:3e:5b:3c:51:66:a6:99:f8:f9:b2:97:21:
+        e4:f8:14:3b:fd:fc:2a:a3:5c:1b:ca:4f:bb:99:b4:a9:a4:17:
+        9d:8b:4a:4d:d0:96:8b:12:af:e0:77:f5:2b:33:ce:64:0d:88:
+        55:54:db:2d:2a:5b:6c:8e:5c:f2:86:3d:bd:66:68:6e:83:2b:
+        cb:aa:fe:48:6e:8d:e4:44:c2:a6:47:a0:ae:be:d3:70:9c:bf:
+        83:e6:3f:88:c0:81:2a:fa:42:86:bb:e6:1a:a7:27:7d:6d:41:
+        90:36:07:61:b3:f1:11:3e:12:c7:bc:dc:df:7c:87:33:ee:70:
+        1c:45:85:66:77:19:b9:9c:9c:83:0c:93:65:7c:49:13:9e:b3:
+        79:6a:ef:83:34:55:c1:01:30:a4:bc:e6:73:97:6a:ba:be:e0:
+        98:57:da:d2:e0:ef:87:35:b6:f3:7f:1e:74:1b:1e:96:87:e5:
+        4a:24:8c:fd:1e:0a:ff:e2:02:2f:fd:fd:5b:0f:c8:7d:4f:28:
+        b0:10:5c:a0:ef:51:5b:51:a5:0f:ea:04:a6:12:a0:f1:21:a0:
+        65:1d:5a:fa:b1:e1:0d:20:e7:28:88:29:7e:65:20:b6:47:01:
+        df:a2:43:3a:05:7b:e8:fb:c7:ab:b7:97:62:de:81:78:a2:a2:
+        fb:3c:a4:1a:bd:76:22:f5:7f:4e:9a:cc:05:6e:0e:f3:3a:94:
+        3c:6e:d3:8c:c8:fc:30:87:b0:2c:17:66:2f:47:9f:72:25:16:
+        4e:1a:12:af:cd:84:9b:cc:6b:ff:4a:03:4e:5d:e9:48:50:07:
+        61:4b:a5:84:6b:3b:3a:75:91:b2:87:d8:48:bd:eb:c7:9f:a1:
+        cc:cc:89:62:c7:32:a9:38:d3:24:73:1c:ed:4c:76:ff:45:97:
+        50:10:30:21:a7:65:cb:f7:65:bc:d4:28:e7:45:76:82:83:0f:
+        e1:aa:75:2f:f6:93:d0:7c:09:8f:74:55:13:39:c5:24:4e:6c:
+        05:93:a4:69:71:1a:5a:1f:88:e5:83:60:c8:e3:72:10:88:26:
+        8c:14:99:76:8a:d8:93:5a:98:68:2a:c5:73:0b:54:9d:7b:c7:
+        d7:9a:6b:a6:fb:7b:60:1e:1d:7e:16:c5:32:00:48:80:77:34:
+        9a:76:b0:fb:08:78:ea:ec:39:6c:fc:28:81:f7:fd:69:b5:82:
+        6d:79:7f:8b:af:e5:08:b2:bc:70:7c:00:29:62:d4:85:d2:fa:
+        1c:ed:00:6c:86:a3:3b:b3:2b:90:3d:73:22:aa:db:2d:a8:0b:
+        a3:d3:0b:fb:13:18:3f:9e:b6:43:32:cc:0a:95:2f:ec:6f:83:
+        a2:98:1f:0c:7a:9c:aa:b2:ab:84:01:1c:a7:80:4d:f6:08:53:
+        cd:c6:0c:09:c0:53:b3:2c:3b:ee:99:ab:fa:1c:d7:31:b7:56:
+        bf:db:37:a6:26:de:4b:cf:ef:e0:16:77:81:c4:07:57:50:c8:
+        67:91:d2:eb:58:c0:f6:c5:2e:42:1c:4c:e3:8e:b7:ca:f9:b5:
+        b6:02:ea:e2:55:78:56:b7:42:10:f6:d5:ca:48:2b:24:e3:7c:
+        43:1d:6b:b6:c2:a0:78:9c:19:1a:26:2f:8d:50:41:18:ad:99:
+        5c:95:d8:eb:9e:aa:09:de:11:2d:e1:5b:b0:51:f0:d1
+-----BEGIN CERTIFICATE-----
+MIIKNzCCBh+gAwIBAgICAJkwDQYJKoZIhvcNAQELBQAwgaUxCzAJBgNVBAYTAlVT
+MQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU3ByaW5nZmllbGQxIzAhBgNVBAoMGkFw
+YWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uMRYwFAYDVQQLDA1BcGFjaGUgVG9tY2F0
+MTYwNAYDVQQDDC1BcGFjaGUgVG9tY2F0IFRlc3QgTG9uZyBDaGFpbiBJbnRlcm1l
+ZGlhdGUgMDYwHhcNMjYwOTE4MDkxMzAyWhcNNDYwOTEzMDkxMzAyWjCBgTELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEG
+A1UECgwaQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNo
+ZSBUb21jYXQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCBCIwDQYJKoZIhvcNAQEBBQAD
+ggQPADCCBAoCggQBAKM7B8B8VAO9uvL0umIGbTGOxCS5nBTx9ZNSuUH0SWRNikgT
+ZABg40jGrL3GlH8l5LwQ7hwSf4msoAFGdyHfQ5prhCHTMh5wxdISL2WRHjfNS9t8
+zM0HD+BS4JYHTGHLpe4jmiOdUi6XL/GKH+jd6jVevT8DGKWy+LIdoegpfabyP02J
+KNTxRDDlz3OZ2DSzuu3vXgS9rtVaWWVFWLiGlvGs00pVIgFXY0dUMr47KRapS9X+
+nR0tt0OcxnYVxKjsBwjWmbJMYh/6ZIKMIMJhgu8fhggbXJnUsR/oJt9SP7laLzAy
+nN+uCxclZh+KtOuJQFRqeTAUglfDYGMqRpOoEXnZAZf6wVpy6aziJfG6kE8VERSc
+4KSR5CGthFtobKko7m/2R76aaucDaDMrP38iLwrnBFLolMyMUK/ZpAE16mWTVjQK
+s0WYvD84TQBaagxldWUlf5PEt2D2BOMXTKNVgKx8iPtrxqILqclhQugJ1j9wA4xm
+rnxJfvcyhfKfr4M33xdcP6A0GsDBLPixlwrZ+EQOWxx/y+iw6qumiD0yxkDeBNBu
+mMrAaTB6u8Y78R6Scn8RZvixqXJH+AlE+UJWK3fC/C42O/iz+8JDiMp5v39bYm8T
+4KufjxGs/QwsbomS3lxbkzu2vLIGzfH5iwpEAwwBJ16F6MQ009wpgLQrveQFiKuv
+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
+nBkaJi+NUEEYrZlcldjrnqoJ3hEt4VuwUfDR
+-----END CERTIFICATE-----
diff --git a/test/org/apache/tomcat/util/net/localhost-rsa-longchain-chain.pem 
b/test/org/apache/tomcat/util/net/localhost-rsa-longchain-chain.pem
new file mode 100644
index 0000000000..0150e66ad2
--- /dev/null
+++ b/test/org/apache/tomcat/util/net/localhost-rsa-longchain-chain.pem
@@ -0,0 +1,398 @@
+-----BEGIN CERTIFICATE-----
+MIIKKjCCBhKgAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBpTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBh
+Y2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQx
+NjA0BgNVBAMMLUFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIEludGVybWVk
+aWF0ZSAwNTAeFw0yNjA5MTgwOTEzMDJaFw00NjA5MTMwOTEzMDJaMIGlMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NwcmluZ2ZpZWxkMSMwIQYD
+VQQKDBpBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjEWMBQGA1UECwwNQXBhY2hl
+IFRvbWNhdDE2MDQGA1UEAwwtQXBhY2hlIFRvbWNhdCBUZXN0IExvbmcgQ2hhaW4g
+SW50ZXJtZWRpYXRlIDA2MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEA
+4PzGEluF2DGHpqHUGhjt0LFIt8lGTygW76YNRC2Z6mxz6uV0smC3tHPkIDtvp0IM
+fEjYictKza3Az6tbOypXGl0+8eBTRwaQPGKbzRRKZyqhsZrjLRIDbQxDrpra3u31
+bdNHht85s7P+P+UZJrqPgN+NpUpOOFmbxmMuSM1s2OtoYDlPB9MvkMuYmyFQ2h28
+4OsR827pudRU4y5qJMpEBkaYlM4xN5Y2WD7rhsXbv9PL4N4SSqcJ6RWqC3tGE0dI
+y5pWRFT0CTpnE36D4SG/6Abl7HASSd4G27kDfyeVLNawbfYjFFcXxQcXbnw1uRPa
+4FXCwi0vJb7XeD1QmURFyGXYj5yWXwzmbgcZUeNDYb+qU/N7OF6CmGoC03JVBeCm
+IuT3oYXkG6UBND3b/3/avSaYiSMC2br/IAGDgxqIJSqj9LghHbbI+0EyUBnKO63C
+PnbbFRjlFWWFGZtSg9vCpKknzdTnG2KmgK+k0bRu4GNmy/1Qg/EBgmkhHxveqJ/b
+nOOaDUaesA+disIymBDcMFGKX8iTqGRNIRuqDlWYok6aFveU2nr/O6Zgs+NDnGu6
+YXVd6W3h+hwU3iqLtE423EK7pFPzh1ZSI9sZta4hlnzOpk6qQlhAcWIcpvaV3+09
+U0OlD4Yhr6IGfwGqgvGxjCQMh+UHC2j+mqSWm73vzt7RFTva5Wb0a1XnE5bpwUDK
+wpZD5hpyT5emnMYseiqTkTfCvGJjDdjpEWANpWP9y89YXnM7kvH932tI6UsSjy/L
+vFNlNQtEhZuCcRo/4sUA/GSXB2toZqLNSLkg9sQXExfVSWH7AN1qeVlc4ZS52NX/
+WRJV+a71ZbZq5DtdIxPYhTYOS8MDLGYVpj+x8JDu7H1wA3qIlrBUO1sBmSUvTKr+
+AzJbAspmJubzqjoGjtgRy6dYHkd0Qtt42j0uSQQ924EqumMy1nELT/KPyZpYcXsd
+HERtOdbN/vJcnsepYe6C08oYSASPjJlHBsnJ4s/5EbVgWW8bPXJPXh2HoDSNMNU5
+tOJ0D3SqQ1H5dO8tvuAz9WuA1iuNOdrbm0iUmmh9TCKrvkX4+7gbj/i9OO5jMQAe
+ZBLewph1Nj2IHjDWAS8KyBxRVKMvli+KYfR3muTG3BY5mfZmBQ7OyaYZLDx5JK9Z
+YoTuQDnMC6rlP9QgcdVkzX4nm6Ixot27R+jFCQQb5R33XFFx+xfxQGiQeAsBR549
+bu5hy1+NdGS6GidPkXpB3mcB4u8Y03EwZ3piLDRVo/IpBF5xfQEYl3APiW6a4Zmn
+nMRPYb0ghdsgv7vTn2Vhw3m6o7h2D4pF4ZaKGodYIUMGiGd40aSgmAKm4ADVSNn6
+Q3GVpXHvvEUiiG70njR+XQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQU+7x4Fk4syoDQ1/ouEMNz5cEvlg4wHwYDVR0j
+BBgwFoAUJlShUj/RT5SkCIDQio7rMaV7/lswDQYJKoZIhvcNAQELBQADggQBAKPy
+p3xcWjWIe4BvexXR8lNfZbizb5AdCFNnM9LM45FN1M+MFBzunBd1LWB+1bovj6UV
+NJD8pgHchVGK0Oh3nsdhOJmmyJeqZ1SNKFCt/m4MhyaXnWq9XXVT6ERFESNrpotd
+NMvRe0E2Xxa25VpKLPuq+K5d2s8NB133METTUWA0bGrUPA1qjwaOdVfEtcl/ybVf
+5PrCw/d/UBqEVIvyXxZu+oQN8h85ftbO70BJM85xxvmxkb7WNKqngKvv+7yC2K4m
+xI1bza760DlxSz006Ut10V0l8Wrn6J/+y1AKMXNPISr0uxZIBn0pvAn4VR19BBFd
+h6hR7DJOlcGgO546c1MXO+VtkFkMhbw1ajwkWj0zojUvSbQISbaxJalJyFpV9KRN
+yQlWZLIMVi417ebB2frELHxIWXQxC9udClQ4RZa0M+JubpjK/ARFlkVi6j+3puQc
+DY+GJ1g/FV8+rZFN8ZgdIU1YPSHNS9GUQkEIwizc7/Hqh0L0+W3ipsFjyw3xP61T
+I/Y7tgMobJxoGLNp2P8fiCk+WDbgpLSOJnZJROqiA2oyOdOiLzKvmRQStdcn5Sx5
+i/dK1pNbEZl0egEIFqmnpt4dxlHpfXH/TvI+sBB5YmVtPTJ+6tCXLIFyVsOcqb9P
+BQ4treeEIJo2rzB6gQhNNLJdheA+ys7N7xQYdrTDYgPhFgFRNnC63oUqnok14bpk
+OUYVv4yniUiZ9WfBNXjwwCQguySAER/Yq/IMWnObBlg5n8WTbloyVqDMvcvO05jh
+L4buRZD1lCxcMZx6Ls/KEIWyBO3UoC+aqteix9jn9VFm1LTvLm+IhcAQ8nb9bZfV
++AKJvqWFF8qIpY4U0mFbWCZHhMaMWkLkVZB9fH9/sb6eF2deTMnhVmlBvxLTbFF7
+Mlbg4qAtzTbYAD4fh4uJtAzAoxHK+SlMgP+GFZ97CTxX8wN80joxTtymhhxyVMXG
+FETuQe941JflxLklSfd3UvBUTPg6QOaPGGpMtB7p4bExGiDWexWHlkk94OoPppIs
+RtElKMtiAPXoHkzd3M+yAQxiXpHaLiQsbLNpk3umVOEiugau93gyUNwJwWPOEhf5
+nGR3mhncwa4xtox109l+z6tLmBdJw3Ph1ij0dBB3oc3CCJONfYcJG5PEMG2KsGJz
+LRb3zgnHX1I1gCDlwx58otb7X3kOm9OnTfHxenSvVJBmldkHHksS5O6jY6ahMMWb
+o3MM9kOlV6XFLvn831x7pwteQvjUi/Xoz5QRNfG3+Vkb3045VR6ywT5UZ8C1RAZy
+mPE4UW+bI6HHxHIsHLzqgl9x3+uu/p7UmDjd8SKVSNOlK3GHFZeA28WNBBmx2IcM
+6lkmqw1v8rrScNOzqec=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIKKjCCBhKgAwIBAgIBBTANBgkqhkiG9w0BAQsFADCBpTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBh
+Y2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQx
+NjA0BgNVBAMMLUFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIEludGVybWVk
+aWF0ZSAwNDAeFw0yNjA5MTgwOTEzMDJaFw00NjA5MTMwOTEzMDJaMIGlMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NwcmluZ2ZpZWxkMSMwIQYD
+VQQKDBpBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjEWMBQGA1UECwwNQXBhY2hl
+IFRvbWNhdDE2MDQGA1UEAwwtQXBhY2hlIFRvbWNhdCBUZXN0IExvbmcgQ2hhaW4g
+SW50ZXJtZWRpYXRlIDA1MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEA
+26cJqH5EMKFWG+obHK6he+JFzuydCrZYeEDLewW0wyzSl9tvpymLmOUrd+Dau6NG
+/tUJTn41CNTHPtZCrAb/opysnk9w6anUtuP9nssL0HdXyv9BTxXvZ1eSEQaEkN3o
+qi6UFNWAuMubzMPJ/M1BWEnvj8Hm9YsEFrCZmgVSz6rPOZ/YKyFx+8MtG5Qvlnhx
+YTIG2vjnfPZd/G7QjAHb0mS9QwOwgEjgKVfT8D56ksqF5e5mvISHDAsfQ/msVIZu
+t6LZu+ji6+kZFAvu5gf9ux8KjpYh4fR1YfzumV5abuYhX2DO4R/N3Wb4AMOheqbr
+uWdrxo3Bk4grooVnLGzQC4sQY/toY03ybgvthLPyYQ8ht4/S/ZZJw0CQJrGS0uS4
+AhkhE0nwX6gRd+dTcVTQiWmRQC1FldJV8qpO6uHrqdj5Vrk2ptfEIrliwPXljlUv
+QrYBDHODamhfR27emC5opvs6nMIwQqXC7UcJ/+UBtyWW73Ao4JTgyY5tUFEVhdfJ
+TnXUDFAFzbrWY4xr6kzlIFJkul//MIkg8a+3BhOJCGgeBcSBz7ZOYEe0Bo3feoBD
+/Z5am2vrUIa8x6L7bzDRD12HUgDvy9uWGU9UZjHMLKV9+juT9QDaCqlf9HDMcJU6
+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
+Q1p3sOvwBudR6MFT42g=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIKKjCCBhKgAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBpTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBh
+Y2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQx
+NjA0BgNVBAMMLUFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIEludGVybWVk
+aWF0ZSAwMzAeFw0yNjA5MTgwOTEzMDJaFw00NjA5MTMwOTEzMDJaMIGlMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NwcmluZ2ZpZWxkMSMwIQYD
+VQQKDBpBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjEWMBQGA1UECwwNQXBhY2hl
+IFRvbWNhdDE2MDQGA1UEAwwtQXBhY2hlIFRvbWNhdCBUZXN0IExvbmcgQ2hhaW4g
+SW50ZXJtZWRpYXRlIDA0MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEA
+4zyw9rV0GeJFHv+/pq6jBUOJMxZ2RhWo/q+h0DmYdCP+loo9eP8gSSi+N1RonGpY
+4onMl5PvWurg36mOfjFDPXwwKz37prmPd504/61o5w+QKmkuj+qb8TYMk/vjFonG
+VIU+evZWClHZB7H4ekcLXBoj9XomYPtxC01uvONWpqOqteGt4Ws51Tcsy+D7SJfx
+soCoQWqviEX8JnbKxZrexsDLTB/rPaTaVrndHbrMaXoCIa920ZD09cQ+ZToBpemg
+nJZpEE2um+z1ZJnYyAriQsnsvHuwIrFPT5m00bNkviNfhV3JBRRAyBHA+xU4Hx+e
+XFcg2WnszTUs5cc0rG3EE9MntEXU0ZOnYGSgcmh0dnE+Z74hxFRtCpp2kY67meOo
+TYxminriHz/bLcNXn+nTfbXxebUy00jFFd1rq/lRfCXC21QdCOGY2/0nhlMNB79G
+sYXvCX9E6FvKlXTeTUDOmBI/sZvZorQKghlAVPfVIiNgUt9QexorAKwKtjzDcVU1
+9IAhk90sp/vtb+upJ4oUWT+ue4T59RLe31MBK0MxNQ+QjX+pj1onvG0wx1LigZpe
+eDjjV+Ys+4xC2Pygdk69cFzYPa+wEPXuSETXVURXbLgFgWzyluCGaXBgbcAHcjDx
+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
+zLF3U4LGJdPKnqenceA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIKKjCCBhKgAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBpTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBh
+Y2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQx
+NjA0BgNVBAMMLUFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIEludGVybWVk
+aWF0ZSAwMjAeFw0yNjA5MTgwOTEzMDFaFw00NjA5MTMwOTEzMDFaMIGlMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NwcmluZ2ZpZWxkMSMwIQYD
+VQQKDBpBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjEWMBQGA1UECwwNQXBhY2hl
+IFRvbWNhdDE2MDQGA1UEAwwtQXBhY2hlIFRvbWNhdCBUZXN0IExvbmcgQ2hhaW4g
+SW50ZXJtZWRpYXRlIDAzMIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEA
+t9DJmCeJJdgbzgdhBGpDnwssC3dwbCUj4Lzam7inRJq3H1DN79cJEZSC3do4VGMS
+zDrwcttZIK+35XT9pgF2ig0xSDh/vOhHaIlf7dK7pfR5m9/Wr7WzGzZ0QgFoZQpK
+yB1JeUUFv96Mi/kXqtXejUCnKf8fKnjeou6nm69+oxEHZrFRObTjiFdJypRe8Ese
+C6HukjXl66KS9PmX17U4zcONU1aEnYI+e2/s7f8yxVYVejIQ8RrOGTMKwT7rwT8J
+Z/Gy6YUHRYuLNbEMJVJxOGSsMsiXVrBc/GBccB4xg5iJWUP4rEnTzSJEBlunvyLE
+jh7U82r0uZZ/QHrOZI3G5Z6a5s2TQ3T1zYd2og5bIvUkyUHIxxZyNneTpFQ6RUSu
+r/XItcfZEOFFsqOKtZ7nqreC4vp7aUyNREjNy91yjYLjy5ZzxGAePcz0pPGaiPu5
+zFwqUkM/5FkRyOrmJevdbsV9vK+i36Ungk0SpjBn/nvnHJztUS18FliDD6Wh7oPT
+ch1BQZ25kOugXh/tQGM6NuDJH+MK6vWl8nR3IIlmwR9ee0vJFwEZRWiiydvlI1I5
+vECUnPhc+eaQKn/hIsjKjhd8XcrZvNWyYbyt0cSoe8fCvJSteL3nXNnxcYIVsKeZ
+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
+Z6qWqwS7QCjBIn2ARt0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIKKjCCBhKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBpTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBh
+Y2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQx
+NjA0BgNVBAMMLUFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIEludGVybWVk
+aWF0ZSAwMTAeFw0yNjA5MTgwOTEzMDFaFw00NjA5MTMwOTEzMDFaMIGlMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NwcmluZ2ZpZWxkMSMwIQYD
+VQQKDBpBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjEWMBQGA1UECwwNQXBhY2hl
+IFRvbWNhdDE2MDQGA1UEAwwtQXBhY2hlIFRvbWNhdCBUZXN0IExvbmcgQ2hhaW4g
+SW50ZXJtZWRpYXRlIDAyMIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEA
+pQ/n9EgBWGyDHXN4NdL5HetHyIDbP/idqfQ/ZB7chz7zm6tva9F0ziuOn4U/czUX
+v98ZU85n6yi7TZOhJo3v6Ce92dTkPpT1fZlw7dQVLWNp98+YhGUB3kENextiwH2X
+P4mt1bBGdizejFVzcmK5PmQAsjJrkjLzyKlO2e0ydsMnkIqWWaGis9OqWMMJBxUQ
+E79aRwkI67KHOXTXmHe7WUIeSVOr+bsPcD6UYmbDod7xi8lOT09fFjUz2kUOGyO1
+mIlY92szo5FlT5zN2Bl9KSLeNsG8dQkIhcjpetvlM6GW8m5XwlG0/hRKfd1k/cFd
+eX0WKDaWEcOBtQ/iCPuMULbeHw4WU3S2d+HtvZc6aVdysJFa0J8FYSvGihf9W1kP
+4XI+cvO7Yhs0GQSuzaKECOJZnawaDabV8dTlvFgaG28fdO9ACiAVGT9uQKLtIB/P
+pX+c4w9FoHYuAwVkv4Y6nCE51t8De+A34AMjxTL/0wpl0NveNi/GgDX0DrVlrpfx
+qVWJsh2wgBjv/cCjyiJlNCrDsIFuv3C6xnleQmD3oY8BOuKRaBw+DU9Fb7gjiIaC
+hAVpCY/Q4MUQcqqmJbOcsBxFDO+vU8bFm6AhyDL6Gl9a0KEcSbKEGanzVl1Rc1xZ
+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
+v5KLeuwRmRFABjD+CBQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIKHzCCBgegAwIBAgIBATANBgkqhkiG9w0BAQsFADCBmjELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBh
+Y2hlIFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQx
+KzApBgNVBAMMIkFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIFJvb3QwHhcN
+MjYwOTE4MDkxMzAxWhcNNDYwOTEzMDkxMzAxWjCBpTELMAkGA1UEBhMCVVMxCzAJ
+BgNVBAgMAkNBMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEjMCEGA1UECgwaQXBhY2hl
+IFNvZnR3YXJlIEZvdW5kYXRpb24xFjAUBgNVBAsMDUFwYWNoZSBUb21jYXQxNjA0
+BgNVBAMMLUFwYWNoZSBUb21jYXQgVGVzdCBMb25nIENoYWluIEludGVybWVkaWF0
+ZSAwMTCCBCIwDQYJKoZIhvcNAQEBBQADggQPADCCBAoCggQBAKbFLJR++IL6P0ZM
+6MGZZXRHnna0UC2lkpGxfrl6kz+O909d0mdgBBFz3BVe/wZeJmvvd8BcGl+FN0J4
+eIBbbXa5yu0naodFiKiMqIkzLnpzcAX8FSI32C0O2FJHyRQ7zcWxSX+JLc3UgMcK
+KdxlLIvNT2VCO0lLAnCSXmih59IYWRPjdu+9C61v90sH8CjtD/sxMAyoKMHJpsXn
+iAFB/khzFV31QZH0uGf8Cal964MXgwGnQrAwu4G3jbFP9XiqZkinZaG+TncK6+Xe
+hvAMKP8IyhwpiRKYG8vvv9JhMChLLtU+aEdw+a2o7Uc/CapSgNOzytSdkJzu7Y2j
+K5XJxX+2bmYW5Aey7UC9oGNd+jwkXCnLWJ1fQMlKZJd5Ao+GEG8I0DPZXC3AvtZ5
+9sm1MEOyuk/OEwBq2WRD5DCoGqO1yNnOww+dhY6mo3mZanULVYl7XNT/8IAQJeqY
+7DGjWyRD7na6rQpzbZ+0R30dl+6XDe2QGBZlqebxUxJoJqm7+/r6dG8HEALI1T/p
+QwixCnAdujDuYDMIaAV70y41L2fImPzik0MJxDZANiMNSZ5uipb6LyUXiP0puE2W
+pq/i4i9i9xxjU1zzWDZdnCeWYEeuIMFsdAXe4oF9inX9+PPwC/gUnnKQvV8OWvu6
+hmpd8J656Pniuj2YowN6tOL5XikFeopvaD7HElGl8Omy2jb1hHTo7+3086JTz/RX
+KixpjXBplPcbc93OMFXTgzKylO56P19M8ktRZh7JrHiv1FFToLqoA8/W8WT1W7Fp
+AtI6Nwi/SUmVNHM1i3CryZdVaBTR/BQ7jHGo5F2LeubDTRYBkd907ucWoVqtNgnK
+IQapQ91tB4n5gAPKcvr1mHWPme6rz7G+qvO2dJ32b11DQzRj/GSQl6eBPMONxR73
+Qf9i5r7uiHIyHw55o/Y2yIrn7fECERpsmbyYmcqmR96WP0JPT3Dwam2dTWpTpNrT
+fzg3O1RpH4YkW9CzDL2HKL9tM+8Km0Fgyk76QTmGHegoV4x7LfBYTzPWFiBzoPhZ
+LPn8ngmEhFnzS0l7norFT3zp+TlaLQt87yUL+LncbwusUUGxgJ+a5HoWpiilnBmk
+p/Z6NWJRn4mGYOgSxtI0/MwDudccBsx5Rk1HcIsvK5sCS2VLRaKv3xcvPfFzCF9q
+YnY2G8DPubvT72KYCUB0WbvAGISVoJ21ad0I1lfL/MYy2xuE4Yhbyeuh1YhrJlNI
+9Mo1Eu7WvZjJ+Prl5rgWsWEucT1T19d+vZAoFhuCOWwcbTiSVmcA5qjux3OYVmZI
+1V/1VE0olrtX1U8B2vLWKNEOzWaM5EfDnwF8qwVI6mbnrKhB1kShtvHhAcXGcuJ4
+jv0QhDUCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMXTLG1RPgCSo2IGU3xXzcED0nQAMB8GA1UdIwQYMBaAFCRgk29V
+oV5B/HEGUHedhwvM5y0kMA0GCSqGSIb3DQEBCwUAA4IEAQAUshDJrJylsfqIDz14
+pFJKbBNtgGV3VHZGKiSVrGy/hEc9qKvEcirEOCURx47GOZY6XpVPWnfdkT/hR0FQ
+dG+JEi2Z3vZsha/LhTDz37MhphEoWTj4ew2RjzokPQcWU5EXQ10YwgxAvi23IELZ
+hhxGG2+2d1gjsVaWkEEDp82lNCZ8GAB/4ALJXQywODlVHtT3iJyLa9AjnUp+1GYs
+R4NPX8LTqY2uGQHaD4pe6eZZnhllbDWSfCPB15eVql/OUs40dYoELAdkyYhk4eGv
+rcxPwoCMO/M8DoNFUyKiXniCXTPNxLRm045VWa5qTjxfg0hrJ5PHFYnRFEGv25xm
+KnDsKYkYaSMwcRWYLWBxgIs3vqB+LGfrFoOwGMKnQh+DnDQwIF/+YcF5dEeMB8uD
+iMJxPmOLyaN8w0RkBOJflVy37ru37swZiunf0/wmYexoHE4+gPClNEM6BJtpZlzT
+7SxKEsJb0T6JNC48VO4CBk0Ig1tqpY1EUx1SGU/CikjjCVjMQMKwqQEjdD85cTcQ
+fIdM0pqN1Uueu8Ic/mYs5UDPeDUjRATisaEJx9shppQauXP6p6DPbnllb5qHp0/0
+Z5THbl6MLU3mibhkXMCM3BqUqgnGwsdlRrp1iGsMO/X3UXsmOBuWEm7Qwiv4VPxr
+nD/YuNxi9hMrzClFoeGvmZhKM3HNfs8JmiMz2YSfG/BxAeFODhOoLrchxA7DeoLI
+tchyuwtG+SX93HSHkMKBgoGdLX/olFrP0+8Mo1PwYdWbCNniHDyB4yi2Rm/jgHAf
+Wz7XnKIXG6rrkCArS9x+X47JMarEzGYswaoTwFyk1VBGxZAMs9F2lG75lwQuwnxe
+PxzXHJ0JqjQRiu3PTXRPH/qeuUl0/qguIxiTwpbXaX+dPh4i39oB/aBE15vQS3zP
+8edYM7D8YeLUHyN0/sOTswYP1otcp7sV9pXmACK4tZTGfQAh5Hc5wB36pF0yGgSz
+LqzuBkQjhWBujBGyeATlKmDNJ1vFD8OA9C4bjPOgoHrcqbHuWaxr6aoPb/Nf79Tk
+NEjtgm6n910n+rg+STnGT8CEq7faak+Sr9KZ9e2Oyk2ySIo4EQgnbezwsJu437Zd
+uSc/Hc1NRSWS67kqGwU0Cr5ZRQPsbYk3NUmr/IDbIH7w5aiQXnGwBv1BE4VgSkR2
+vFF3e/vNbKVXln+lzeQeum2A5w5fzkZYB9Bh9XIqxjdipazV91Ejhg5cMYxrsqbo
+qXDGg7pdY0Ae7SKgT6Z6RLDCVsLU4duyLqLkiQqH48hepOakIV8nTJti1K1Ddrxw
+Enh+gOHgI9c+1atjHcONuU1TQFO2DsDO988uo5zLD39Gpw2NwvcgtaiNehzZml1I
+2LYN
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIKBjCCBe6gAwIBAgIUFjxh+4hJII9t8O9xj6c5GEp6PiAwDQYJKoZIhvcNAQEL
+BQAwgZoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU3ByaW5n
+ZmllbGQxIzAhBgNVBAoMGkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uMRYwFAYD
+VQQLDA1BcGFjaGUgVG9tY2F0MSswKQYDVQQDDCJBcGFjaGUgVG9tY2F0IFRlc3Qg
+TG9uZyBDaGFpbiBSb290MB4XDTI2MDkxODA5MTMwMVoXDTQ2MDkxMzA5MTMwMVow
+gZoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU3ByaW5nZmll
+bGQxIzAhBgNVBAoMGkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uMRYwFAYDVQQL
+DA1BcGFjaGUgVG9tY2F0MSswKQYDVQQDDCJBcGFjaGUgVG9tY2F0IFRlc3QgTG9u
+ZyBDaGFpbiBSb290MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEArfNV
+CWN0fa5iEq5w+Go/MfDF7va7Q3z4ZYrVZBvjjjYIIay0QGxF5PgMywS5WfCdilt0
+a939DpPjbBJiHWve6FTUCGwJX2HUD2w/S/C8KGZx1JokaKWuZC1FyRhkLk5gnWoC
+oUQTNwSnFDLJ19kvgicwNYksdDin6ZUe3VzIz4UWUwvpxCs7qfYZJLeST+YIUoAB
+UgLz+w+GC7jF7sP9vPjkh4l7y1FYObe1k8RM4BTCu7yoOeP7vMZytso5jTaMcObl
+Dgl3rJhYZqeHg0l1wHKa8R337frImOdgA7MQbkZAkL94RhHG5wAVjCzEPFdAiO/y
+Z5Npw9GYOwgdGCYY13dxHWg0gqN1joAvGC8Obadm2ttaa/wA0Jwp9VTN0XGVN4Xx
+cUGJQNbVBeTWyGqYCSedJBbg+r2FmgiB650Td9p8C+m6vqmuT7tX1v4wBMjVHum3
+gqZqgW/8qHrsAi8KN+odggysakNZ9YE4mYONkOpz4Ktx4sYSiNTec2HpnX1w1Ftp
+6CvCgKfMa6oTYvpLqEiS8VcZub3lkwlfi1VmXq/7RuyER9o4sw3sRgML3w1mor5g
+GzpHdXw/3tzH27n4uZqpTKa8HvU+ut5ruw25gN3c0I73H5HAP7AlmohOhnIRcFxk
+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
+JBZhvkfnc53rI2vgJU31Rwi0O3J0frYxdUw=
+-----END CERTIFICATE-----
diff --git a/test/org/apache/tomcat/util/net/localhost-rsa-longchain-key.pem 
b/test/org/apache/tomcat/util/net/localhost-rsa-longchain-key.pem
new file mode 100644
index 0000000000..a8ef4a23a3
--- /dev/null
+++ b/test/org/apache/tomcat/util/net/localhost-rsa-longchain-key.pem
@@ -0,0 +1,100 @@
+-----BEGIN PRIVATE KEY-----
+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
+QcxpAMKsTj3p/ilenERsy3N10aIM6A==
+-----END PRIVATE KEY-----
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 7f458c0878..3b7bfdcea5 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -301,6 +301,13 @@
       <update>
         Remove support for HTTP 0.9. (markt)
       </update>
+      <fix>
+        <bug>70236</bug>: Fix a stalled TLS handshake with the OpenSSL based
+        implementations of <code>SSLEngine</code> when the first flight of
+        handshake messages sent by the server is too large to fit in the
+        buffer used by the BIO pair. Patch submitted by Lukas Hellebrandt.
+        (remm)
+      </fix>
       <!-- Entries for backport and removal before 12.0.0-M1 below this line 
-->
     </changelog>
   </subsection>


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

Reply via email to