Domanda

Sto riscontrando uno strano problema con un'applicazione JSF su cui sto attualmente lavorando.Sembra che ci siano due parti del mio programma che entrano in collisione.

Ci sono due parti:

  • la funzionalità "bancaria".
  • la funzionalità di posta

La parte rilevante del funzionalità bancaria (È una banca falsa solo per questo esercizio):

String path = FacesContext.getCurrentInstance().getExternalContext()                .getRealPath("/") + "/WEB-INF/sec/certs.jks";

ErrorHandler.trace(path);

System.setProperty("javax.net.ssl.trustStore", path);

Qui sta impostando il Trust Store con il certificato per il server della banca.

IL posta la parte assomiglia a questa:

Properties props = new Properties();
props.put("mail.smtp.auth", this.smtpServer.isAuthenticated());
props.put("mail.smtp.starttls.enable", this.smtpServer.isTls());
props.put("mail.smtp.host", this.smtpServer.getHostaddr());
props.put("mail.smtp.port", this.smtpServer.getPort());
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.debug", "true");

final String username = this.smtpServer.getUsername();
final String password = this.smtpServer.getPassword();

Session session = Session.getDefaultInstance(props,
        new javax.mail.Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

session.setDebug(true);

Un modo per riprodurre il problema:

Il problema che sto riscontrando è che se avvio l'applicazione e, ad esempio, utilizzo la funzionalità "cambia mail" ricevo immediatamente la mail di notifica.Nessun problema lì.Quindi proverò ad acquistare un prodotto attivando così la funzionalità banca.

È qui che si presenta il problema:

Communication Error: javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
 - with linked exception:
[javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

Un altro modo per riprodurre il problema:

Ora diciamo che riavvio la mia applicazione e provo a ordinare qualcosa, questa volta funzionerà ma la funzionalità di posta è interrotta con questo messaggio di errore:

DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
TRACE Error Could not connect to SMTP host: smtp.gmail.com, port: 465

Linea di fondo:

Se attiro la banca e poi posta -> Mail non funziona se attiro la posta e poi banca -> banca non funziona

Qualcuno che potrebbe trovare un problema lì?

Grazie!

È stato utile?

Soluzione

La tua "funzionalità bancaria" sta cambiando il negozio di fiducia.Il nuovo truststore deve disporre dei certificati necessari per convalidare la connessione SSL con il tuo server di posta.Puoi inizializzare il tuo truststore con tutti i certificati CA dal truststore predefinito di JDK oppure puoi aggiungere solo il certificato specifico per il tuo server di posta: consulta la sezione InstallCert programma.Infine, puoi configurare JavaMail per utilizzare un trust store separato o modificare la funzionalità bancaria per utilizzare esplicitamente un trust store anziché sovrascrivere il trust store predefinito;quelli sono probabilmente più complicati.

Altri suggerimenti

Il problema era che la funzionalità di posta funzionava se non era impostato il trustStore (perché utilizza il trustStore predefinito del sistema che si trova in:

/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/security/cacerts

su un Mac.

La funzionalità bancaria utilizza il proprio certificato che si trovava in:

MyProject/.../WEB-INF/sec/certs.jks

Ogni volta che JavaMail tentava di autenticarsi sul server SMTP di Google, tentava di utilizzare il trustStore certs.jks anche se avevo disattivato la proprietà trustStore della funzionalità bancaria impostata nel metodo di posta.

Aggiustare:

All'inizio del metodo di posta:

String path = FacesContext.getCurrentInstance().getExternalContext()
            .getRealPath("/")
            + "WEB-INF/sec/certs.jks";
System.setProperty("javax.net.ssl.trustStore", path);

Importa il valore predefinito cacerts keyStore nel nostro keyStore personalizzato:

keytool -importkeystore -srckeystore certs.jks -destkeystore cacerts
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top