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

markt pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 0fd9d5c623 Simplify the process of using a custom SSLContext
0fd9d5c623 is described below

commit 0fd9d5c6236b7d775156a094bf93ecfd505dc11f
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Mar 28 07:02:31 2025 +0000

    Simplify the process of using a custom SSLContext
    
    Based on PR #805 by Hakky54.
---
 .../apache/tomcat/util/net/SSLContextWrapper.java  | 87 ++++++++++++++++++++++
 java/org/apache/tomcat/util/net/SSLUtil.java       | 18 +++++
 webapps/docs/changelog.xml                         |  4 +
 3 files changed, 109 insertions(+)

diff --git a/java/org/apache/tomcat/util/net/SSLContextWrapper.java 
b/java/org/apache/tomcat/util/net/SSLContextWrapper.java
new file mode 100644
index 0000000000..280d4dbbce
--- /dev/null
+++ b/java/org/apache/tomcat/util/net/SSLContextWrapper.java
@@ -0,0 +1,87 @@
+/*
+ *  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.
+ */
+package org.apache.tomcat.util.net;
+
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.Objects;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSessionContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509KeyManager;
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * Wrapper class to simplify using a pre-configured {@code 
javax.net.ssl.SSLContext} instance with an
+ * {@code SSLHostConfigCertificate}.
+ */
+class SSLContextWrapper implements SSLContext {
+
+    private final javax.net.ssl.SSLContext sslContext;
+    private final X509KeyManager keyManager;
+    private final X509TrustManager trustManager;
+
+    SSLContextWrapper(javax.net.ssl.SSLContext sslContext, X509KeyManager 
keyManager, X509TrustManager trustManager) {
+        this.sslContext = Objects.requireNonNull(sslContext);
+        this.keyManager = Objects.requireNonNull(keyManager);
+        this.trustManager = Objects.requireNonNull(trustManager);
+    }
+
+    @Override
+    public void init(KeyManager[] kms, TrustManager[] tms, SecureRandom sr) {
+        // NO-OP as it is already initialized
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+
+    @Override
+    public SSLSessionContext getServerSessionContext() {
+        return sslContext.getServerSessionContext();
+    }
+
+    @Override
+    public SSLEngine createSSLEngine() {
+        return sslContext.createSSLEngine();
+    }
+
+    @Override
+    public SSLServerSocketFactory getServerSocketFactory() {
+        return sslContext.getServerSocketFactory();
+    }
+
+    @Override
+    public SSLParameters getSupportedSSLParameters() {
+        return sslContext.getSupportedSSLParameters();
+    }
+
+    @Override
+    public X509Certificate[] getCertificateChain(String alias) {
+        return keyManager.getCertificateChain(alias);
+    }
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return trustManager.getAcceptedIssuers();
+    }
+}
diff --git a/java/org/apache/tomcat/util/net/SSLUtil.java 
b/java/org/apache/tomcat/util/net/SSLUtil.java
index ef3f0d2708..d85655e3c9 100644
--- a/java/org/apache/tomcat/util/net/SSLUtil.java
+++ b/java/org/apache/tomcat/util/net/SSLUtil.java
@@ -21,6 +21,8 @@ import java.util.List;
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.SSLSessionContext;
 import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509KeyManager;
+import javax.net.ssl.X509TrustManager;
 
 /**
  * Provides a common interface for {@link SSLImplementation}s to create the
@@ -29,6 +31,22 @@ import javax.net.ssl.TrustManager;
  */
 public interface SSLUtil {
 
+    /**
+     * Creates an instance of Tomcat's {@code SSLContext} from the provided 
inputs. Typically used when the user wants
+     * to provide a pre-configured {@code javax.net.ssl.SSLContext} instance. 
There is no need to call
+     * {@link SSLContext#init(KeyManager[], TrustManager[], 
java.security.SecureRandom)} on the returned value.
+     *
+     * @param sslContext   The JSSE SSL context
+     * @param keyManager   The JSSE key manager
+     * @param trustManager The JSSE trust manager
+     *
+     * @return An instance of Tomcat's {@code SSLContext} formed from the 
provided inputs.
+     */
+    static SSLContext createSSLContext(javax.net.ssl.SSLContext sslContext, 
X509KeyManager keyManager,
+            X509TrustManager trustManager) {
+        return new SSLContextWrapper(sslContext, keyManager, trustManager);
+    }
+
     SSLContext createSSLContext(List<String> negotiableProtocols) throws 
Exception;
 
     KeyManager[] getKeyManagers() throws Exception;
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 5e82c457e0..b547b6020d 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -166,6 +166,10 @@
         Add missing code to process an OpenSSL profile, such as
         <code>PROFILE=SYSTEM</code>, using FFM. (remm)
       </fix>
+      <add>
+        Simplify the process of using a custom SSLContext for an HTTPS enabled
+        connector. Based on pull request <pr>805</pr> by Hakky54. (markt)
+      </add>
     </changelog>
   </subsection>
 </section>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to