Question

Je suis un problème étrange avec une application JSF que je travaille actuellement sur. Il semble qu'il y ait deux parties de mon programme qui collant.

Il y a deux parties:

  • la fonctionnalité "bancaire"
  • la fonctionnalité de courrier

La partie pertinente de la fonctionnalité bancaire (c'est une fausse banque juste pour cet exercice):

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

ErrorHandler.trace(path);

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

Ici, il définit le magasin Trust Store avec le certificat pour le serveur de banque.

La partie la partie ressemble à ceci:

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 moyen de reproduire le problème:

Le problème que je suis confronté est que si je démarre la demande et, par exemple, utilisez la fonctionnalité "Changer de courrier", je vais obtenir mon courrier de notification immédiatement. Pas de problème là-bas. Ensuite, je vais essayer d'acheter un produit déclenchant ainsi la fonctionnalité bancaire.

C'est là que le problème montre:

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]

Une autre façon de reproduire le problème:

Disons maintenant que je redémarre ma candidature et essayons de commander quelque chose, cette fois, cela fonctionnera mais la fonctionnalité de courrier est cassée avec ce message d'erreur:

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

Bottom Line:

Si je déclenche une banque, puis mail -> courrier ne fonctionne pas Si je déclenche le courrier, puis la banque -> la banque ne fonctionne pas

Quiconque pourrait trouver un problème là-bas?

Merci!

Était-ce utile?

La solution

Votre "fonctionnalité bancaire" change le magasin de fiducie.Ce nouveau magasin de fiducie doit avoir les certificats nécessaires à la validation de la connexion SSL avec votre serveur de messagerie.Vous pouvez initialiser votre magasin Trust avec tous les certificats de CA à partir du magasin Trust de défaillance JDK ou vous pouvez ajouter uniquement le certificat spécifique de votre serveur de messagerie - voir le InstallAt programme.Enfin, vous pouvez configurer JavaMail pour utiliser un magasin de fiducie distinct ou modifier votre fonctionnalité bancaire pour utiliser un magasin de fiducie explicitement plutôt que de remplacer le magasin de fiducie par défaut;ceux-ci sont probablement plus compliqués.

Autres conseils

Le problème était que la fonctionnalité de messagerie fonctionnait s'il n'y a pas d'ensemble de Fittore (car il utilise la confiance de la confiance par défaut du système situé dans:

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

sur un Mac.

La fonctionnalité bancaire utilise son propre certificat situé dans:

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

Chaque fois que le JavaMail a essayé d'authentifier au serveur SMTP de Google, il a essayé d'utiliser le client cert.jks, même si je déséquipente la propriété de TrustStore la fonctionnalité bancaire définie dans la méthode Mail.

correction:

Au début de la méthode postale:

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

Importer la touche cacerts par défaut dans notre propre keyStore personnalisé:

keytool -importkeystore -srckeystore certs.jks -destkeystore cacerts

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top