Author: rjung
Date: Sat Aug 19 21:32:23 2017
New Revision: 1805528

URL: http://svn.apache.org/viewvc?rev=1805528&view=rev
Log:
Add support for the OpenSSL SSL_CONF API when
using TLS with OpenSSL implementation.

This will need tcnative 1.2.13.

It can be used by adding OpenSSLConf elements
underneath SSLHostConfig. The new element
contains a list of OpenSSLConfCmd elements,
each with the attributes "name" and "value".

Example:

<SSLHostConfig>
    <OpenSSLConf>
        <OpenSSLConfCmd name="Protocol" value="-SSLv3,-TLSv1,TLSv1.1,TLSv1.2"/>
        <OpenSSLConfCmd name="CipherString" value="ECDHE-RSA-AES128-SHA"/>
        <OpenSSLConfCmd name="Options" 
value="-SessionTicket,-Compression,ServerPreference"/>
    </OpenSSLConf>
</SSLHostConfig>

Added:
    tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java   
(with props)
    tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java   
(with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/startup/Catalina.java
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/util/net/SSLHostConfig.java
    tomcat/trunk/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/startup/Catalina.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Catalina.java?rev=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/Catalina.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/Catalina.java Sat Aug 19 
21:32:23 2017
@@ -354,6 +354,20 @@ public class Catalina {
                             "addCertificate",
                             
"org.apache.tomcat.util.net.SSLHostConfigCertificate");
 
+        
digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf",
+                                 
"org.apache.tomcat.util.net.openssl.OpenSSLConf");
+        
digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf");
+        
digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf",
+                            "setOpenSslConf",
+                            "org.apache.tomcat.util.net.openssl.OpenSSLConf");
+
+        
digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd",
+                                 
"org.apache.tomcat.util.net.openssl.OpenSSLConfCmd");
+        
digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd");
+        
digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd",
+                            "addCmd",
+                            
"org.apache.tomcat.util.net.openssl.OpenSSLConfCmd");
+
         digester.addObjectCreate("Server/Service/Connector/Listener",
                                  null, // MUST be specified in the element
                                  "className");

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=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat Aug 19 
21:32:23 2017
@@ -43,6 +43,7 @@ import org.apache.tomcat.jni.OS;
 import org.apache.tomcat.jni.Poll;
 import org.apache.tomcat.jni.Pool;
 import org.apache.tomcat.jni.SSL;
+import org.apache.tomcat.jni.SSLConf;
 import org.apache.tomcat.jni.SSLContext;
 import org.apache.tomcat.jni.SSLContext.SNICallBack;
 import org.apache.tomcat.jni.SSLSocket;
@@ -55,6 +56,7 @@ import org.apache.tomcat.util.collection
 import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState;
 import org.apache.tomcat.util.net.Acceptor.AcceptorState;
 import org.apache.tomcat.util.net.SSLHostConfig.Type;
+import org.apache.tomcat.util.net.openssl.OpenSSLConf;
 import org.apache.tomcat.util.net.openssl.OpenSSLEngine;
 
 
@@ -540,6 +542,51 @@ public class AprEndpoint extends Abstrac
             String[] protocolsArray = protocols.toArray(new String[0]);
             SSLContext.setAlpnProtos(ctx, protocolsArray, 
SSL.SSL_SELECTOR_FAILURE_NO_ADVERTISE);
         }
+
+        long cctx;
+        OpenSSLConf openSslConf = sslHostConfig.getOpenSslConf();
+        if (openSslConf != null) {
+            // Create OpenSSLConfCmd context if used
+            try {
+                log.info(sm.getString("endpoint.apr.makeConf"));
+                cctx = SSLConf.make(rootPool,
+                                    SSL.SSL_CONF_FLAG_FILE |
+                                    SSL.SSL_CONF_FLAG_SERVER |
+                                    SSL.SSL_CONF_FLAG_CERTIFICATE |
+                                    SSL.SSL_CONF_FLAG_SHOW_ERRORS);
+            } catch (UnsatisfiedLinkError e) {
+                
log.warn(sm.getString("endpoint.apr.missingOpenSSLConfSupport"), e);
+                throw new Exception(sm.getString("endpoint.apr.errMakeConf"), 
e);
+            } catch (Exception e) {
+                throw new Exception(sm.getString("endpoint.apr.errMakeConf"), 
e);
+            }
+            if (cctx != 0) {
+                // Check OpenSSLConfCmd if used
+                log.info(sm.getString("endpoint.apr.checkConf"));
+                try {
+                    if (!openSslConf.check(cctx)) {
+                        log.error(sm.getString("endpoint.apr.errCheckConf"));
+                        throw new 
Exception(sm.getString("endpoint.apr.errCheckConf"));
+                    }
+                } catch (Exception e) {
+                    throw new 
Exception(sm.getString("endpoint.apr.errCheckConf"), e);
+                }
+                // Apply OpenSSLConfCmd if used
+                log.info(sm.getString("endpoint.apr.applyConf"));
+                try {
+                    if (!openSslConf.apply(cctx, ctx)) {
+                        log.error(sm.getString("endpoint.apr.errApplyConf"));
+                        throw new 
Exception(sm.getString("endpoint.apr.errApplyConf"));
+                    }
+                } catch (Exception e) {
+                    throw new 
Exception(sm.getString("endpoint.apr.errApplyConf"), e);
+                }
+            }
+        } else {
+            cctx = 0;
+        }
+
+        sslHostConfig.setOpenSslConfContext(Long.valueOf(cctx));
         sslHostConfig.setOpenSslContext(Long.valueOf(ctx));
     }
 
@@ -551,6 +598,15 @@ public class AprEndpoint extends Abstrac
             SSLContext.free(ctx.longValue());
             sslHostConfig.setOpenSslContext(null);
         }
+        Long cctx = sslHostConfig.getOpenSslConfContext();
+        if (cctx != null) {
+            try {
+                SSLConf.free(cctx.longValue());
+            } catch (UnsatisfiedLinkError e) {
+                
log.warn(sm.getString("endpoint.apr.missingOpenSSLConfSupport"), e);
+            }
+            sslHostConfig.setOpenSslConfContext(null);
+        }
     }
 
 

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties?rev=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties Sat 
Aug 19 21:32:23 2017
@@ -74,6 +74,14 @@ endpoint.apr.pollMergeEvents=Merge polle
 endpoint.apr.pollUnknownEvent=A socket was returned from the poller with an 
unrecognized event [{0}]
 endpoint.apr.tooManyCertFiles=More certificate files were configured than the 
AprEndpoint can handle
 endpoint.apr.remoteport=APR socket [{0}] opened with remote port [{1}]
+endpoint.apr.makeConf=Creating OpenSSLConf context
+endpoint.apr.errMakeConf=Could not create OpenSSLConf context
+endpoint.apr.checkConf=Checking OpenSSLConf
+endpoint.apr.errCheckConf=Error during OpenSSLConf check
+endpoint.apr.assignConf=Assigning SSL context to OpenSSLConfCmd context
+endpoint.apr.applyConf=Applying OpenSSLConfCmd to SSL context
+endpoint.apr.errApplyConf=Could not apply OpenSSLConf to SSL context
+endpoint.apr.missingOpenSSLConfSupport=Your tcnative library has no support 
for OpenSSLConf, version 1.2.13 or higher is required.
 endpoint.jsse.noSslContext=No SSLContext could be found for the host name [{0}]
 endpoint.nio.registerFail=Failed to register socket with selector from poller
 endpoint.nio.selectorCloseFail=Failed to close selector when closing the poller
@@ -130,6 +138,8 @@ sslHostConfig.certificate.notype=Multipl
 sslHostConfig.mismatch=The property [{0}] was set on the SSLHostConfig named 
[{1}] and is for connectors of type [{2}] but the SSLHostConfig is being used 
with a connector of type [{3}]
 sslHostConfig.prefix_missing=The protocol [{0}] was added to the list of 
protocols on the SSLHostConfig named [{1}]. Check if a +/- prefix is missing.
 sslHostConfigCertificate.mismatch=The property [{0}] was set on the 
SSLHostConfigCertificate named [{1}] and is for certificate storage type [{2}] 
but the certificate is being used with a storage of type [{3}]
+sslHostConfig.opensslconf.null=Attempt to set null OpenSSLConf ignored
+sslHostConfig.opensslconf.alreadyset=Attempt to set another OpenSSLConf ignored
 
 sslImplementation.cnfe= Unable to create SSLImplementation for class [{0}]
 

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SSLHostConfig.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SSLHostConfig.java?rev=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SSLHostConfig.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SSLHostConfig.java Sat Aug 19 
21:32:23 2017
@@ -33,6 +33,7 @@ import javax.net.ssl.TrustManagerFactory
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.net.openssl.OpenSSLConf;
 import org.apache.tomcat.util.net.openssl.ciphers.Cipher;
 import 
org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser;
 import org.apache.tomcat.util.res.StringManager;
@@ -66,10 +67,11 @@ public class SSLHostConfig implements Se
 
     private String hostName = DEFAULT_SSL_HOST_NAME;
 
+    private transient Long openSslConfContext = new Long(0);
     // OpenSSL can handle multiple certs in a single config so the reference to
     // the context is here at the virtual host level. JSSE can't so the
     // reference is held on the certificate.
-    private transient Long openSslContext;
+    private transient Long openSslContext = new Long(0);
 
     // Configuration properties
 
@@ -110,6 +112,7 @@ public class SSLHostConfig implements Se
     private boolean disableCompression = true;
     private boolean disableSessionTickets = false;
     private boolean insecureRenegotiation = false;
+    private OpenSSLConf openSslConf = null;
 
     public SSLHostConfig() {
         // Set defaults that can't be (easily) set when defining the fields.
@@ -117,6 +120,16 @@ public class SSLHostConfig implements Se
     }
 
 
+    public Long getOpenSslConfContext() {
+        return openSslConfContext;
+    }
+
+
+    public void setOpenSslConfContext(Long openSslConfContext) {
+        this.openSslConfContext = openSslConfContext;
+    }
+
+
     public Long getOpenSslContext() {
         return openSslContext;
     }
@@ -235,6 +248,22 @@ public class SSLHostConfig implements Se
     }
 
 
+    public OpenSSLConf getOpenSslConf() {
+        return openSslConf;
+    }
+
+
+    public void setOpenSslConf(OpenSSLConf conf) {
+        if (conf == null) {
+            throw new 
IllegalArgumentException(sm.getString("sslHostConfig.opensslconf.null"));
+        } else if (openSslConf != null) {
+            throw new 
IllegalArgumentException(sm.getString("sslHostConfig.opensslconf.alreadySet"));
+        }
+        setProperty("<OpenSSLConf>", Type.OPENSSL);
+        openSslConf = conf;
+    }
+
+
     public Set<SSLHostConfigCertificate> getCertificates() {
         return getCertificates(false);
     }

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties?rev=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties 
Sat Aug 19 21:32:23 2017
@@ -21,6 +21,24 @@ openssl.keyManagerMissing=No key manager
 openssl.incompleteClientCASupport=Incomplete support for client CAs, please 
update your tcnative version
 openssl.trustManagerMissing=No trust manager found
 openssl.addedClientCaCert=Added client CA cert: [{0}]
+openssl.makeConf=Creating OpenSSLConf context
+openssl.errMakeConf=Could not create OpenSSLConf context
+openssl.checkConf=Checking OpenSSLConf
+openssl.errCheckConf=Error during OpenSSLConf check
+openssl.assignConf=Assigning SSL context to OpenSSLConfCmd context
+openssl.applyConf=Applying OpenSSLConfCmd to SSL context
+openssl.errApplyConf=Could not apply OpenSSLConf to SSL context
+openssl.missingOpenSSLConfSupport=Your tcnative library has no support for 
OpenSSLConf, version 1.2.13 or higher is required.
+
+opensslconf.checkCommand=OpenSSLConf checking command (name [{0}], value [{1}])
+opensslconf.checkFailed=Failure while checking OpenSSLConf
+opensslconf.applyCommand=OpenSSLConf applying command (name [{0}], value [{1}])
+opensslconf.applyFailed=Failure while applying OpenSSLConf to SSL context
+opensslconf.failedCommand=OpenSSLConf failed command (name [{0}], value [{1}]) 
with result [{2}] - will be ignored
+opensslconf.failedFinish=OpenSSLConf finish failed with result [{2}]
+opensslconf.noCommandName=OpenSSLConf no command name - will be ignored 
(command value [{0}])
+opensslconf.resultCommand=OpenSSLConf command (name [{0}], value [{1}]) 
returned [{2}]
+opensslconf.missingOpenSSLConfSupport=Your tcnative library has no support for 
OpenSSLConf, version 1.2.13 or higher is required.
 
 engine.engineClosed=Engine is closed
 engine.renegotiationUnsupported=Renegotiation is not supported

Added: tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java?rev=1805528&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java 
(added)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java Sat 
Aug 19 21:32:23 2017
@@ -0,0 +1,131 @@
+/*
+ *  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.openssl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.jni.SSLConf;
+import org.apache.tomcat.util.res.StringManager;
+
+public class OpenSSLConf {
+
+    private static final Log log = LogFactory.getLog(OpenSSLConf.class);
+    private static final StringManager sm = 
StringManager.getManager(OpenSSLConf.class);
+
+    private final List<OpenSSLConfCmd> commands = new 
ArrayList<OpenSSLConfCmd>();
+
+    public void addCmd(OpenSSLConfCmd cmd) {
+        commands.add(cmd);
+    }
+
+    public boolean check(long cctx) throws Exception {
+        boolean result = true;
+        OpenSSLConfCmd cmd;
+        String name;
+        String value;
+        int rc;
+        for (int i = 0; i < commands.size(); i++) {
+            cmd = commands.get(i);
+            name = cmd.getName();
+            value = cmd.getValue();
+            if (name == null) {
+                log.error(sm.getString("opensslconf.noCommandName", value));
+                result = false;
+                continue;
+            }
+            if (log.isDebugEnabled()) {
+                log.debug(sm.getString("opensslconf.checkCommand", name, 
value));
+            }
+            try {
+                rc = SSLConf.check(cctx, name, value);
+            } catch (UnsatisfiedLinkError e) {
+                
log.warn(sm.getString("opensslconf.missingOpenSSLConfSupport"), e);
+                log.error(sm.getString("opensslconf.checkFailed"));
+                return false;
+            }
+            if (rc <= 0) {
+                log.error(sm.getString("opensslconf.failedCommand", name, 
value, rc));
+                result = false;
+            } else if (log.isDebugEnabled()) {
+                log.debug(sm.getString("opensslconf.resultCommand", name, 
value, rc));
+            }
+        }
+        if (!result) {
+            log.error(sm.getString("opensslconf.checkFailed"));
+        }
+        return result;
+    }
+
+    public boolean apply(long cctx, long ctx) throws Exception {
+        boolean result = true;
+        try {
+            SSLConf.assign(cctx, ctx);
+        } catch (UnsatisfiedLinkError e) {
+            log.warn(sm.getString("opensslconf.missingOpenSSLConfSupport"), e);
+            log.error(sm.getString("opensslconf.applyFailed"));
+            return false;
+        }
+        OpenSSLConfCmd cmd;
+        String name;
+        String value;
+        int rc;
+        for (int i = 0; i < commands.size(); i++) {
+            cmd = commands.get(i);
+            name = cmd.getName();
+            value = cmd.getValue();
+            if (name == null) {
+                log.error(sm.getString("opensslconf.noCommandName", value));
+                result = false;
+                continue;
+            }
+            if (log.isDebugEnabled()) {
+                log.debug(sm.getString("opensslconf.applyCommand", name, 
value));
+            }
+            try {
+                rc = SSLConf.apply(cctx, name, value);
+            } catch (UnsatisfiedLinkError e) {
+                
log.warn(sm.getString("opensslconf.missingOpenSSLConfSupport"), e);
+                log.error(sm.getString("opensslconf.applyFailed"));
+                return false;
+            }
+            if (rc <= 0) {
+                log.error(sm.getString("opensslconf.failedCommand", name, 
value, rc));
+                result = false;
+            } else if (log.isDebugEnabled()) {
+                log.debug(sm.getString("opensslconf.resultCommand", name, 
value, rc));
+            }
+        }
+        try {
+            rc = SSLConf.finish(cctx);
+        } catch (UnsatisfiedLinkError e) {
+            log.warn(sm.getString("opensslconf.missingOpenSSLConfSupport"), e);
+            log.error(sm.getString("opensslconf.applyFailed"));
+            return false;
+        }
+        if (rc <= 0) {
+            log.error(sm.getString("opensslconf.finishFailed", rc));
+            result = false;
+        }
+        if (!result) {
+            log.error(sm.getString("opensslconf.applyFailed"));
+        }
+        return result;
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java?rev=1805528&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java 
(added)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java 
Sat Aug 19 21:32:23 2017
@@ -0,0 +1,39 @@
+/*
+ *  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.openssl;
+
+public class OpenSSLConfCmd {
+
+    private String name = null;
+    private String value = null;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java?rev=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java 
Sat Aug 19 21:32:23 2017
@@ -44,6 +44,7 @@ import org.apache.juli.logging.LogFactor
 import org.apache.tomcat.jni.CertificateVerifier;
 import org.apache.tomcat.jni.Pool;
 import org.apache.tomcat.jni.SSL;
+import org.apache.tomcat.jni.SSLConf;
 import org.apache.tomcat.jni.SSLContext;
 import org.apache.tomcat.util.net.AbstractEndpoint;
 import org.apache.tomcat.util.net.Constants;
@@ -88,6 +89,9 @@ public class OpenSSLContext implements o
     private final long aprPool;
     private final AtomicInteger aprPoolDestroyed = new AtomicInteger(0);
 
+    // OpenSSLConfCmd context
+    protected final long cctx;
+    // SSL context
     protected final long ctx;
 
     static final CertificateFactory X509_CERT_FACTORY;
@@ -112,6 +116,27 @@ public class OpenSSLContext implements o
         aprPool = Pool.create(0);
         boolean success = false;
         try {
+            // Create OpenSSLConfCmd context if used
+            OpenSSLConf openSslConf = sslHostConfig.getOpenSslConf();
+            if (openSslConf != null) {
+                try {
+                    log.info(sm.getString("openssl.makeConf"));
+                    cctx = SSLConf.make(aprPool,
+                                        SSL.SSL_CONF_FLAG_FILE |
+                                        SSL.SSL_CONF_FLAG_SERVER |
+                                        SSL.SSL_CONF_FLAG_CERTIFICATE |
+                                        SSL.SSL_CONF_FLAG_SHOW_ERRORS);
+                } catch (UnsatisfiedLinkError e) {
+                    
log.warn(sm.getString("openssl.missingOpenSSLConfSupport"), e);
+                    throw new Exception(sm.getString("openssl.errMakeConf"), 
e);
+                } catch (Exception e) {
+                    throw new 
SSLException(sm.getString("openssl.errMakeConf"), e);
+                }
+            } else {
+                cctx = 0;
+            }
+            sslHostConfig.setOpenSslConfContext(Long.valueOf(cctx));
+
             // SSL protocol
             int value = SSL.SSL_PROTOCOL_NONE;
             for (String protocol : sslHostConfig.getEnabledProtocols()) {
@@ -168,6 +193,13 @@ public class OpenSSLContext implements o
             if (ctx != 0) {
                 SSLContext.free(ctx);
             }
+            if (cctx != 0) {
+                try {
+                    SSLConf.free(cctx);
+                } catch (UnsatisfiedLinkError e) {
+                    
log.warn(sm.getString("openssl.missingOpenSSLConfSupport"), e);
+                }
+            }
             if (aprPool != 0) {
                 Pool.destroy(aprPool);
             }
@@ -343,6 +375,30 @@ public class OpenSSLContext implements o
                 SSLContext.setNpnProtos(ctx, protocolsArray, 
SSL.SSL_SELECTOR_FAILURE_NO_ADVERTISE);
             }
 
+            // Apply OpenSSLConfCmd if used
+            OpenSSLConf openSslConf = sslHostConfig.getOpenSslConf();
+            if (openSslConf != null && cctx != 0) {
+                // Check OpenSSLConfCmd if used
+                log.info(sm.getString("openssl.checkConf"));
+                try {
+                    if (!openSslConf.check(cctx)) {
+                        log.error(sm.getString("openssl.errCheckConf"));
+                        throw new 
Exception(sm.getString("openssl.errCheckConf"));
+                    }
+                } catch (Exception e) {
+                    throw new Exception(sm.getString("openssl.errCheckConf"), 
e);
+                }
+                log.info(sm.getString("openssl.applyConf"));
+                try {
+                    if (!openSslConf.apply(cctx, ctx)) {
+                        log.error(sm.getString("openssl.errApplyConf"));
+                        throw new 
SSLException(sm.getString("openssl.errApplyConf"));
+                    }
+                } catch (Exception e) {
+                    throw new 
SSLException(sm.getString("openssl.errApplyConf"), e);
+                }
+            }
+
             sessionContext = new OpenSSLSessionContext(ctx);
             sslHostConfig.setOpenSslContext(Long.valueOf(ctx));
             initialized = true;

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1805528&r1=1805527&r2=1805528&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Sat Aug 19 21:32:23 2017
@@ -63,6 +63,14 @@
   </subsection>
   <subsection name="Coyote">
     <changelog>
+      <add>
+        Add support for the OpenSSL SSL_CONF API when using TLS with
+        OpenSSL implementation. This will need tcnative 1.2.13.
+        It can be used by adding <code>OpenSSLConf</code> elements
+        underneath <code>SSLHostConfig</code>. The new element contains
+        a list of <code>OpenSSLConfCmd</code> elements, each with
+        the attributes <code>name</code> and <code>value</code>.
+      </add>
       <fix>
         When using JSSE TLS configuration with the OpenSSL implementation and
         client certificates: include client CA subjects in the TLS handshake



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

Reply via email to