Problèmes JavaMail après avoir utilisé le magasin de clés
-
26-12-2019 - |
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
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);
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]
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
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!
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.
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