[jira] [Created] (JAMES-4193) SSL management improvments

"Benoit Tellier (Jira)" <[email protected]> Sat, 28 Mar 2026 05:56:00 +0000 (UTC)
Newsgroups gmane.comp.jakarta.james.devel
Message-ID <[email protected]>
Benoit Tellier created JAMES-4193:
-------------------------------------

             Summary: SSL management improvments
                 Key: JAMES-4193
                 URL: https://issues.apache.org/jira/browse/JAMES-4193
             Project: James Server
          Issue Type: Improvement
            Reporter: Benoit Tellier
         Attachments: Screenshot from 2026-03-28 06-54-41.png

h3. Why? 

On flamegraphs (see attached) I was able to prove James uses up to 15% of its applicative CPU doing SSL with JSSE including loads of handshakes which is suboptimal

h3. What?

I first want to run a session cache for SSL, allowing reuse and skipping work needed upon the handshake.

Second I would like to run a custom implem based on boringssl and netty-tcnative (linux only...) in tmail-backend and currently overrides are only possible by subclassing. Evolve the Encryption.Factory so that it is injected thus axtension could rely on Dependency Injections for overriding it.

h3. How?

h4. Session cache

Conf:

{code:java}
<imapservers>
    <imapserver enabled="true">
        <jmxName>imapserver</jmxName>
        <bind>0.0.0.0:143</bind>
        <connectionBacklog>200</connectionBacklog>
        <tls socketTLS="false" startTLS="true">
            <!-- To create a new keystore execute:
              keytool -genkey -alias james -keyalg RSA -storetype PKCS12 -keystore /path/to/james/conf/keystore
             -->
            <keystore>file://conf/keystore</keystore>
            <keystoreType>PKCS12</keystoreType>
            <secret>james72laBalle</secret>
            <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider>

             <sessionCacheSize>1M</sessionCacheSize>
        </tls>
...
{code}


Expected gains: ~50% of these 3%, less object allocations, less latency upon connect.

So easy to do that we shall not refrain


h4. Custom encryption layer

{code:java}
public interface Encryption {

    interface Factory {
        Encryption create(SslConfig conf) throws Exception;
    }
{code}

Inject this, no longer hard code it's usage in LegacyJavaEncryptionFactory

Gains: be able to specify our SSL strategy in Twake mail



--
This message was sent by Atlassian Jira
(v8.20.10#820010)