Frage

Ich habe ein seltsames Problem mit einer JSF-Anwendung, an der ich gerade arbeite.Es scheint, als ob zwei Teile meines Programms kollidieren.

Es gibt zwei Teile:

  • die „Banking“-Funktionalität
  • die Mail-Funktionalität

Der relevante Teil des Banking-Funktionalität (Nur für diese Übung handelt es sich um eine Fake-Bank):

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

ErrorHandler.trace(path);

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

Hier wird der Trust Store mit dem Zertifikat für den Bankserver eingerichtet.

Der Post Teil sieht so aus:

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

Eine Möglichkeit, das Problem zu reproduzieren:

Das Problem, mit dem ich konfrontiert bin, besteht darin, dass ich sofort meine Benachrichtigungsmail erhalte, wenn ich die Anwendung starte und beispielsweise die Funktion „E-Mail ändern“ verwende.Kein Problem.Dann werde ich versuchen, ein Produkt zu kaufen und so die Bankfunktionalität auszulösen.

Da zeigt sich das Problem:

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]

Eine andere Möglichkeit, das Problem zu reproduzieren:

Nehmen wir nun an, ich starte meine Anwendung neu und versuche, etwas zu bestellen. Dieses Mal funktioniert es, aber die E-Mail-Funktionalität ist mit dieser Fehlermeldung defekt:

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

Endeffekt:

Wenn ich die Bank auslöste und dann Mail -> Mail funktioniert nicht, wenn ich Mail und dann die Bank -> Bank nicht funktioniert

Wer könnte dort ein Problem finden?

Danke schön!

War es hilfreich?

Lösung

Ihre "Bankfunktionalität" ändert den Trust Store.Dieser neue Trustspeicher muss über die erforderlichen Zertifikate verfügen, um die SSL-Verbindung mit Ihrem Mail-Server zu bestätigen.Sie können Ihren Trustspeicher mit allen CA-Zertifikaten im JDK-Standard-Trust Store initialisieren, oder Sie können nur das spezifische Zertifikat für Ihren Mailserver hinzufügen - siehe das Programm installCert .Schließlich können Sie JavaNail so konfigurieren, dass Sie einen separaten Trustspeicher verwenden oder Ihre Bankfunktionalität ändern, um einen Trustspeicher ausdrücklich zu verwenden, anstatt den Standard-Trust-Speicher zu überschreiben.Das sind wahrscheinlich komplizierter.

Andere Tipps

Das Problem bestand darin, dass die E-Mail-Funktionalität funktionierte, wenn kein TrustStore festgelegt war (weil der Standard-TrustStore des Systems verwendet wurde, der sich befindet in:

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

auf einem Mac.

Die Banking-Funktionalität verwendet ein eigenes Zertifikat, das sich befindet in:

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

Jedes Mal, wenn JavaMail versuchte, sich beim SMTP-Server von Google zu authentifizieren, versuchte es, den TrustStore certs.jks zu verwenden, obwohl ich die Eigenschaft „trustStore“ der in der Mail-Methode festgelegten Bankfunktionalität deaktiviert habe.

Fix:

Zu Beginn der Mail-Methode:

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

Importieren Sie die Standardeinstellung cacerts keyStore in unseren eigenen benutzerdefinierten keyStore:

keytool -importkeystore -srckeystore certs.jks -destkeystore cacerts
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top