Pregunta

Estoy teniendo un problema raro con una aplicación JSF en la que estoy trabajando actualmente. Parece que hay dos partes de mi programa que están chocando.

Hay dos partes:

  • la funcionalidad "bancaria"
  • la funcionalidad de correo

La parte relevante de la funcionalidad de banca (es un banco falso solo para este ejercicio):

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

ErrorHandler.trace(path);

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

Aquí está configurando la tienda de confianza con el certificado para el servidor bancario.

La parte mail parece esto:

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);

una forma de reproducir el problema:

El problema que enfrento es que si comienzo la aplicación y, por ejemplo, use la funcionalidad "Cambiar correo", obtendré mi correo de notificación inmediatamente. No hay problema allí. Luego intentaré comprar un producto activando así la funcionalidad del banco.

Ahí es donde aparece el 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]

Otra forma de reproducir el problema:

Ahora digamos que reinicie mi solicitud e intente ordenar algo, esta vez funcionará, pero la funcionalidad de correo se rompe con este mensaje de error:

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

línea inferior:

Si activo el banco y luego el correo -> Correo no funciona Si desencadena el correo y luego el banco -> Banco no funciona

¿Alguien que pueda encontrar un problema allí?

¡Gracias!

¿Fue útil?

Solución

Su "funcionalidad bancaria" está cambiando la tienda de confianza.Ese nueva tienda de confianza debe tener los certificados necesarios para validar la conexión SSL con su servidor de correo.Puede inicializar su tienda de confianza con todos los certificados de CA de la tienda de confianza predeterminada JDK, o puede agregar el certificado específico para su servidor de correo: consulte el installcert programa.Finalmente, puede configurar JavaMail para usar un Tienda de fideicomisos separados, o cambiar su funcionalidad bancaria para usar un Tienda de confianza explícitamente en lugar de anular el TIENDO FID DE FISETAL;Esos son probablemente más complicados.

Otros consejos

El problema fue que la funcionalidad de correo estaba funcionando si no hay un conjunto de confianza (porque está utilizando el almacén de confianza predeterminado del sistema que se encuentra en:

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

en una Mac.

La funcionalidad bancaria está usando su propio certificado que se ubicó en:

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

Cada vez que el JavaMail intentó autenticarse en el servidor SMTP de Google, intentó usar la tienda de confianza de CERTS.JKS a pesar de que no me presenta la propiedad TrustStore, la funcionalidad bancaria establece en el método de correo.

corregir:

Al principio del método de correo:

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

Importar el almacén de claves predeterminados cacerts en nuestro propio almacén de claves personalizados:

keytool -importkeystore -srckeystore certs.jks -destkeystore cacerts

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top