Greetings to all of you.

We recently upgraded our application to Wicket 1.5.
However, after upgrading we had problems sending email using SSL from our
application.
This may not be related to wicket at all but I promise we didn't change any
dependencies other than wicket's.
What amuses me is that it works as expected in our older versions which
still use Wicket 1.4.x.
Both the older version and the current version were run using the same JRE.

Here's the code that sends email:

<pre>
public class MailSenderTask implements Runnable
{
    private Properties smtpProperties;
    private EmailMessage message;
    private static final Logger logger =
LoggerFactory.getLogger(MailSenderTask.class);

    public MailSenderTask(Properties smtpProperties, EmailMessage message)
    {
        this.smtpProperties = smtpProperties;
        this.message = message;
    }

    public synchronized void sendMail() throws Exception
    {
        try {
            if (addSSlProvider()) {
                logger.info("Adding ssl provider");
                Security.addProvider(new
com.sun.net.ssl.internal.ssl.Provider());
            } else {
                logger.info("Using plain text connection as ssl/tls is not
enabled");
            }
            Session session = createSession();
            MimeMessage mimeMessage = new MimeMessage(session);
            mimeMessage.setSender(new InternetAddress(message.getSender()));
            mimeMessage.setSubject(message.getSubject());

            if (message.getRecipients().indexOf(',') > 0) {
                mimeMessage.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(message.getRecipients()));
            } else {
                mimeMessage.setRecipient(Message.RecipientType.TO, new
InternetAddress(message.getRecipients()));
            }

            MimeBodyPart bodyPart = new MimeBodyPart();
            bodyPart.setContent(message.getBody(), "text/html");

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(bodyPart);

            if (message.getAttachments() != null &&
message.getAttachments().length > 0) {
                for (File file : message.getAttachments()) {
                    logger.debug("Adding {} as an attachment", file);
                    MimeBodyPart attachmentPart = new MimeBodyPart();
                    attachmentPart.attachFile(file);
                    multipart.addBodyPart(attachmentPart);
                }
            }

            mimeMessage.setContent(multipart);

            logger.info("Sending mail...");
            Transport.send(mimeMessage);
            logger.info("Mail sent to {}", message.getRecipients());
        } catch (Exception ex) {
            throw new EmailException("Error occurred while sending mail",
ex);
        }
    }

    private boolean addSSlProvider()
    {
        String sslEnabledProperty =
smtpProperties.getProperty("mail.smtp.starttls.enable");
        if (StringUtils.isNotEmpty(sslEnabledProperty)) {
            return Boolean.parseBoolean(sslEnabledProperty);
        }
        return false;
    }

    private Session createSession()
    {
        Session session = null;
        if
(Boolean.parseBoolean(smtpProperties.getProperty("mail.smtp.auth"))) {
            logger.info("Creating session with authentication");
            session = createSessionWithAuthentication(smtpProperties);
        } else {
            logger.info("Creating default session");
            session = createDefaultSession(smtpProperties);
        }
        return session;
    }

    private Session createDefaultSession(final Properties smtpProperties)
    {
        return Session.getInstance(smtpProperties);
    }

    private Session createSessionWithAuthentication(final Properties
smtpProperties)
    {
        return Session.getInstance(smtpProperties,
                new Authenticator()
                {
                    @Override
                    protected PasswordAuthentication
getPasswordAuthentication()
                    {
                        return new
PasswordAuthentication(smtpProperties.getProperty("smtp.username"),

smtpProperties.getProperty("smtp.password"));
                    }
                });
    }

    public void run()
    {
        if (smtpProperties != null && message != null) {
            try {
                sendMail();
            } catch (Exception ex) {
                throw new EmailException("Error", ex);
            }
        }
    }
}
</pre>

These are the SMTP properties that were set:

<pre>
mail.smtp.socketFactory.fallback:false
mail.smtp.socketFactory.class:javax.net.ssl.SSLSocketFactory
mail.transport.protocol:smtp
mail.smtp.connectiontimeout:10000
mail.smtp.host:smtp.gmail.com
mail.smtp.timeout:10000
mail.smtp.starttls.enable:true
mail.smtp.port:465
mail.smtp.auth:true
mail.smtp.socketFactory.port:465
mail.smtp.quitwait:false
smtp.username:[email protected]
smtp.password: bar
</pre>

This is the exception thrown:

<pre>
Caused by: javax.mail.MessagingException: Could not connect to SMTP host:
smtp.gmail.com, port: 465
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
~[mail-1.4.4.jar:1.4.4]
    at
com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
~[mail-1.4.4.jar:1.4.4]
    at javax.mail.Service.connect(Service.java:297) ~[mail-1.4.jar:1.4]
    at javax.mail.Service.connect(Service.java:156) ~[mail-1.4.jar:1.4]
    at javax.mail.Service.connect(Service.java:105) ~[mail-1.4.jar:1.4]
    at javax.mail.Transport.send0(Transport.java:168) ~[mail-1.4.jar:1.4]
    at javax.mail.Transport.send(Transport.java:98) ~[mail-1.4.jar:1.4]
    at
com.mcruncher.core.module.email.util.MailSenderTask.sendMail(MailSenderTask.java:75)
~[MailSenderTask.class:2.7.0-SNAPSHOT]
    ... 56 common frames omitted
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException:
Unexpected error: java.security.InvalidAlgorithmParameterException: the
trustAnchors parameter must be non-empty
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1692)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1675)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1204)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
~[na:1.6]
    at
com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
~[mail-1.4.4.jar:1.4]
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
~[mail-1.4.4.jar:1.4]
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
~[mail-1.4.4.jar:1.4.4]
    ... 63 common frames omitted
Caused by: java.lang.RuntimeException: Unexpected error:
java.security.InvalidAlgorithmParameterException: the trustAnchors
parameter must be non-empty
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:57)
~[na:1.6.0_33]
    at sun.security.validator.Validator.getInstance(Validator.java:161)
~[na:1.6.0_33]
    at
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:108)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:204)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
~[na:1.6]
    at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
~[na:1.6]
    ... 67 common frames omitted
Caused by: java.security.InvalidAlgorithmParameterException: the
trustAnchors parameter must be non-empty
    at
java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:183)
~[na:1.6.0_33]
    at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:103)
~[na:1.6.0_33]
    at
java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:87)
~[na:1.6.0_33]
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:55)
~[na:1.6.0_33]
    ... 78 common frames omitted
</pre>

Eagerly awaiting fellow wicket users' help....

-- 
Thanks & regards
James Selvakumar
mcruncher.com

Reply via email to