SSL avec javamail ne fonctionne pas
Essayez de vous connecter à gmail avec TSL, je suis coincé sur certains messages d'erreur. Compte tenu de code ci-dessous:
import java.util.*;
import java.util.logging.*;
import javax.mail.*;
import javax.mail.internet.*;
public class MailHandler extends Handler {
public void publish(LogRecord record) {
try {
String host = "smtp.gmail.com";
int port = 587;
String username = "[email protected]";
String password = "cookiepassword";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
//props.setProperty("mail.smtp.ssl.trust", "smtpserver");
props.put("mail.debug", "true");
Session session = Session.getInstance(props);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]"));
message.setSubject(record.getMessage());
message.setText("Auto");
Transport transport = session.getTransport("smtp");
transport.connect(host, port, username, password);
Transport.send(message);
} catch (MessagingException ex) {
Logger.getLogger(MailHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void close() {}
@Override
public void flush() {}
}
- Je obtenir
run:
DEBUG: JavaMail version 1.4.4
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 mx.google.com ESMTP b5sm13118062wbh.4
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO FloWorkLinux
250-mx.google.com at your service, [95.146.161.196]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
09-Dec-2011 17:05:32 smsalertor.MailHandler publish
SEVERE: null
javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1880)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:648)
at javax.mail.Service.connect(Service.java:295)
at smsalertor.MailHandler.publish(MailHandler.java:33)
at smsalertor.SMSAlertor.main(SMSAlertor.java:107)
Caused by: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl)
at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:196)
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:216)
at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:432)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1875)
... 4 more
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl)
at java.security.Provider$Service.newInstance(Provider.java:1262)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:142)
at javax.net.ssl.SSLContext.getDefault(SSLContext.java:85)
at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:119)
at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:427)
... 5 more
Caused by: java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:645)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
at java.security.KeyStore.load(KeyStore.java:1201)
at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(TrustManagerFactoryImpl.java:221)
at sun.security.ssl.DefaultSSLContextImpl.getDefaultTrustManager(DefaultSSLContextImpl.java:87)
at sun.security.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at java.security.Provider$Service.newInstance(Provider.java:1238)
... 11 more
BUILD SUCCESSFUL (total time: 10 seconds)
Décommentant props.setProperty("mail.smtp.ssl.trust", "smtpserver");
changements de ce
run:
DEBUG: JavaMail version 1.4.4
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 mx.google.com ESMTP em4sm13086182wbb.20
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO FloWorkLinux
250-mx.google.com at your service, [95.146.161.196]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
09-Dec-2011 17:09:37 smsalertor.MailHandler publish
SEVERE: null
javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
java.io.IOException: Can't create MailSSLSocketFactory
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1880)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:648)
at javax.mail.Service.connect(Service.java:295)
at smsalertor.MailHandler.publish(MailHandler.java:33)
at smsalertor.SMSAlertor.main(SMSAlertor.java:107)
Caused by: java.io.IOException: Can't create MailSSLSocketFactory
at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:421)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1875)
... 4 more
Caused by: java.security.KeyStoreException: problem accessing trust storejava.io.EOFException
at sun.security.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:75)
at javax.net.ssl.TrustManagerFactory.init(TrustManagerFactory.java:247)
at com.sun.mail.util.MailSSLSocketFactory$MailTrustManager.<init>(MailSSLSocketFactory.java:333)
at com.sun.mail.util.MailSSLSocketFactory$MailTrustManager.<init>(MailSSLSocketFactory.java:323)
at com.sun.mail.util.MailSSLSocketFactory.<init>(MailSSLSocketFactory.java:115)
at com.sun.mail.util.MailSSLSocketFactory.<init>(MailSSLSocketFactory.java:94)
at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:413)
... 5 more
BUILD SUCCESSFUL (total time: 7 seconds)
Personne vu cela auparavant?
Edit:
Parler de tournant à 10 minutes de copier coller le tutoriel en une journée complète de mal de tête. Je n'ai toujours pas résolu ce problème, cependant, j'ai lu de plus en plus. Apparemment, j'ai besoin d'un magasin de public ssl signatures à comparer. Ce sont censés être dans un chemin le long des lignes de /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security
. À l'aide de sudo update-alternatives --config java
je suis le signaler à /usr/lib/jvm/java-6-sun/jre/bin/java
qui à son tour des points à ce dossier, cependant, il existe également une /usr/lib/jvm/default-java
symlink pas affectées par la présente, pointe actuellement vers java-6-openjdk
, et si je regarde dans ce dossier, il manquait des certificats de sécurité. Et juste qui est utilisé par NetBeans. Oh joie.
Suivantes cette recommandation, je n'ai sudo apt-get install libbcprov-java
qui m'a donné mon dossier de sécurité dans le openjdk (après nettoyage avec le sun-jdk pour un certain temps, qui sans doute est maintenant installé, mais qui sait où, car il n'apparaît pas dans la /usr/lib/jvm/
).
Ce produit toujours le même msg d'erreur. Donc je l'ai déplacé partout pour Windows, essayé de compiler, s'avère code ci-dessus n'est pas assez de travail (n'a pas d'importance pour notre propos que le non travail des bits de venir après le SSL bits) (hey, et merci pour tout le mauvais tutoriaux il maintenant, quel gâchis). De toute façon, enfin quelque chose de travailler avec cette solution (bien qu'il y a beaucoup de redondance dans les il y, et bien qu'il n'est pas TLS mais SSL, mais bon, ...). En tout cas, tous fonctionne bien et en douceur, donc, retour à Ubuntu, et ding dong, même message d'erreur comme ci-dessus. Clairement ressemble à un problème entourant le fichier de clés. Je suis toujours à une perte quant à la résolution du problème (erreur courante est le premier mentionné ci-dessus).
STARTTLS
sur le même port), vous pourriez être en utilisant TLS (c'est à dire SSL successeur, au sein de l'IETF). Ce n'est pas la différence entre SSL et TLS. (Pour une raison quelconque, la différence que vous utilisez est ce que certains outils comme MS Outlook utiliser, mais ce n'est pas correct).
OriginalL'auteur Cookie | 2011-12-09
Vous devez vous connecter pour publier un commentaire.
Il a fallu des jours pour essayer des centaines d'idées selon keytool, truststore, cacerst etc.
Mais finalement j'avais simplement mis à la poste.smtp.le protocole ssl.les biens de la fiducie:
props.setProperty("mail.smtp.ssl.trust", "smtpserver");
OriginalL'auteur Aneesh
Changement
à
Puis le programme s'exécute correctement
Propriétés documentation clairement dit que
Properties
même si hériteHashtable
et aput
son utilisation à l'ensemble de la propriété des paires est fortement déconseillée.OriginalL'auteur duypt
Bien, il s'avère que la sun jdk installé sur le dessus de la jre. Nice. Donc, mon java-6-sun-1.6.0.26 est maintenant un jdk. Selon la. Me convient.
De toute façon, le rejointoiement
/usr/lib/jvm/default-java
à mes nouvellement mis à jour de sun jdk dossier commutateurs NetBeans de openjdk à sun-jdk et dépêchez-vous, il est de travail.OriginalL'auteur Cookie
Je n'ai pas vu, mais l'exception dire que vous n'avez pas mis le serveur smtp de certificat dans votre
trustedca
fichier ou ce fichier est unavaliableHm, ça serait facile, mais vous devez comprendre, ce que vous faites. Regardez keytool doc: docs.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html L'Idée est d'importer le certificat par
keytool
cmd dans $JRE_HOME\lib\security\fichier cacertsOriginalL'auteur korifey
J'ai corrigé un bug dans ce domaine récemment qui pourraient être liés à votre problème. Essayez la dernière version de capture instantanée de ici.
Il a été lié à la façon dont le protocole SSL a été traitée lors d'un serveur de contrôle d'identité est nécessaire. L'ancien code travaillé avec certains serveurs, mais pas d'autres. La version fixe est plus correct. Mais il semble que votre problème a été avec des certificats après tout, compliquée par la façon Ubuntu installe le JDK. Vous pourriez également être intéressé par le JavaMail entrée de la FAQ sur les certificats.
Le JavaMail entrée de la FAQ sur les certificats a un lien mort, de trouver les détails ici.
OriginalL'auteur Bill Shannon
Non!
Selon https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html
et pour imap valeurs.
Toutes les valeurs DOIVENT être donné dans une chaîne de caractères (et c'est aussi la "nature" des Propriétés) comme "123" pour un int de 123 ou "true" pour booléenne vrai.
L'Exception:
javax.mail.MessagingException: java.de sécurité.NoSuchAlgorithmException: Erreur à la con
le structing de mise en œuvre (algorithme: par Défaut, le fournisseur de: SunJSSE, classe: le soleil.la secu
rity.le protocole ssl.SSLContextImpl$DefaultSSLContext);
bases sur la non prise en charge de TLS sur les "vieux" de windows comme vista, XP (voir MS blog).
Je unjared le paquet javax.mail.jar et suivi la trace de retour à la ligne où il a causé cette étrange exception: C'est dans la source SocketFetcher.java (package com.soleil.mail.util;) et exactement à la méthode createSocket() @ la ligne
MailSSLSocketFactory msf = new MailSSLSocketFactory();
Et quand j'ai vérifié cette MailSSLSocketFactory.java il a dit:
OriginalL'auteur Voodoo
Enfin Résolu. J'ai tout essayé pour le faire authentifié sur mon serveur exchange, mais sans succès. Utilisez le code ci-dessous:
OriginalL'auteur Chandan Singh