Hi Matt,

first up: If you get some issue of some trustpath can't be established it's usually the remote. But it could also on your end missing some root ca certs. A test I like to use for my own server is this: https://www.checktls.com/TestReceiver The default settings give you a good first clue what's the issue here. If this test also fails to resolve the trustpath then it's clearly an issue on the remote side using either self-signed certs (or signed by a CA unknown to you) or expired certs. You can also play around with the additional options. The ones I like to use are:
- check DANE
- check cert sigs
- ignore no connections
- ipv4
- ipv6
- check dnssec
- no dns cache
- check crl
- check ocsp

Next: SMTP as by RFC usually defines a fallback to non-tls when starttls fails - but it's up to the clients decision. I'm not sure if James uses standard JavaMail lib for outbound connections - but given it's in the libs folder (and a very old version of 1.6.2 from 2018) I guess so. It's docs states:

mail.smtp.starttls.enable - If true, enables the use of the STARTTLS command (if supported by the server) to switch the connection to a TLS-protected connection before issuing any login commands. If the server does not support STARTTLS, the connection continues without the use of TLS; see the mail.smtp.starttls.required property to fail if STARTTLS isn't supported. Note that an appropriate trust store must configured so that the client will trust the server's certificate. Defaults to false.

mail.smtp.starttls.required - If true, requires the use of the STARTTLS command. If the server doesn't support the STARTTLS command, or the command fails, the connect method will fail. Defaults to false.

Question comes up: The required flag states that when set and StartTLS fails the connection will fail. But does that mean that without required flag set and only the enable flag that it will tolerate a fail of StartTLS? And what kind of failure? Your try to set the required flag via the config doesn't wok because that's not how the James xml config work in general. You could, however, try to add the flag to your start script:
-Dmail.smtp.starttls.required=false
But this will only work if it's not overwritten somewhere in the code that sets up starttls. Also: I guess "command failing" only means that the server sends a proper smtp reply to the StartTLS command other than 220. The issue we get is way deeper in the TLS layer and not at the SMTP layer. And given by the docs for the crypto stuff in java (sorry, there're a few combine - won't list them here) this is an SSL ALERT to which the connection has to be terminated. So even IF overwriting the required flag would work it would be a violation of how ssl works and hence would likely be seen as a vulnerability of javas ssl implementation.

TL;DR: Same as with Ilja: The error seems to be on the remote end and there's little to nothing you can do about on your end. All you can do is to check if external tools result in the same issue to verify if it's on your system or the remote. If external tools as linked can establish a working tls connection it could be an issue with your java setup. On Windows Java comes with its own root-ca store. On linux it uses the systems one at /var/lib/ca-certificates. So check the affected domain with checktls.com what kind of certificate they use. If it's a selfsigned: Try to contact them via other means and ask: "Why?" and "Have you heard of Let's Encrypt?". If they use a CA unknown to you: Could be the mail server you try to connect is part of some internal or closed system.

example: In germany the energy industry uses a closed system for S/MIME secured mail exchange. The certificates are signed by a special non-public government CA specific for this network only. Although these mail servers are connected to the public internet they are not announced anywhere but only in a closed register so it's kind of a closed net but only in the terms of: There's no public list like DNS. Same is true for the project "E-Mail made in Germany" - a network where a few big germany providers have established a "secure" closed network in which they only accept mails from eachother. The idea is that a client of Telekom can be sure that a mail from 1&1 really came from there. But this is flawed as it only gives an idea about "yea, a mail within this network was sent by one of the servers of one of them few" but not "was this a legit mail or just spam of a hacked account".

For us to help you we need some example domains affected by this issue - as far as you can share them, of course.

Have a nice weekend everybody.
Greetings from Germany

Matt

Am 04.08.25 um 11:54 schrieb Matt Pryor:
Hi all, a follow up on this.
After enabling debug on the remote delivery mailet I can see that a number
of messages are failing for various different reasons but the main reason
I'm seeing is "unable to find valid certification path to requested target".

2025-08-01 15:30:42.575 [DEBUG] o.a.j.t.m.r.d.MailDelivrer - Could not
convert socket to TLS
sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target

 From my experience this means that the remote server's SSL certificate is
self-signed, or signed by an untrusted SSL authority.
What is the normal way of handling this for large volume mail servers, as
it must happen a lot.

My idea was to add the following to the RemoteDelivery Mailet config:

     <debug>true</debug>
<startTLS>true</startTLS> <!-- added by MP 2025-07-17-->
<mail.smtp.starttls.required>false</mail.smtp.starttls.required>

I hoped this would cause it to fall back to plain text if TLS could not be
negotiated for the above type of reason
However it seems to be getting ignored or doesn't work as I expected, as
it's still failing messages with TLS errors after n attempts.

Any further ideas please?

Kind regards
Matt Pryor
Research and Development Manager

The International Presence Group of Companies
EMAIL: pr...@presencebpm.com
URL: www.International-presence.com




On Fri, 25 Jul 2025 at 08:58, Matt Pryor <pr...@international-presence.com>
wrote:

Hi both, thanks for the suggestions.

Disabling StartTLS isn't an option as it's a production system.

I've asked the customer to correct their SSL certificate to see if it
fixes the issue for the time being.
If I still have problems I'll check out the verifyServerIdentity parameter.

Kind regards
Matt Pryor
Research and Development Manager

The International Presence Group of Companies
EMAIL: pr...@presencebpm.com
URL: www.International-presence.com




On Thu, 24 Jul 2025 at 16:15, Benoit TELLIER <btell...@linagora.com.invalid>
wrote:

Have you tried setting the verifyServerIdentity
property to false in remote delivery to false?
CF
https://james.staged.apache.org/james-project/3.9.0/servers/distributed/configure/mailets.html#_remotedelivery
 verifyServerIdentityAlso
if you use self signed certificates you may consider unsing authoritative
ones for RemoteDelivery.--

Best regards,

Benoit TELLIER

General manager of Linagora VIETNAM.
Product owner for Team-Mail product.
Chairman of the Apache James project.

Mail: btell...@linagora.com
Tel: (0033) 6 77 26 04 58 (WhatsApp, Signal)


On Jul 24, 2025 3:29 PM, from Rupesh Singh <thaku...@gmail.com>Hi, can
disable ssl and test to ensure cert is the issue.
Thanks,
Rupesh

On Wed, Jul 23, 2025 at 12:14 PM Matt Pryor <
pr...@international-presence.com> wrote:

Hi all,

Running the latest code, Apache James 3.8.2 Server JPA Guice.

I'm seeing this error below when attempting to deliver to some
recipients'
mail servers:

2025-07-22 12:17:49.917 [DEBUG] o.a.j.t.m.r.d.MailDelivrer - Exception
delivering message
(Mail1753186668620-a77a76bb-d3f4-4170-9f5e-8ca8159a2276-to-zzzzzzz.com)
-
Could
not convert socket to TLS
2025-07-22 12:17:49.918 [INFO ] o.a.j.t.m.r.d.MailDelivrer - Could not
convert socket to TLS

My mailetcontainer.xml contains the following, it seems to work on most
occasions but (sod's law) not when the customer is testing it.

<processor state="relay" enabledJmx="true">
    <mailet match="ALL" class="RemoteDelivery">
        ....
        <startTLS>true</startTLS>
    </mailet>
</processor>

I enabled -Djavax.net.debug=ssl:handshake:verbose, -Dmail.debug=true and
after inspecting stderr I believe what's causing it is not trusting the
remote server's SSL certificate which causes Javamail to abandon the
connection.

Testing with openssl, it seems that the SSL certificate CN doesn't match
the server hostname.

This must be a common problem in the wild.

Does anyone have any workarounds? I've tried setting
-Dmail.smtp.ssl.trust=* but it doesn't seem to make any difference.

Many thanks in advance.

Kind regards
Matt Pryor
Research and Development Manager

The International Presence Group of Companies
EMAIL: pr...@presencebpm.com
URL: International-presence.com



---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscr...@james.apache.org
For additional commands, e-mail: server-user-h...@james.apache.org

Reply via email to