SSL с javamail не работает - PullRequest
       34

SSL с javamail не работает

5 голосов
/ 09 декабря 2011

Пытаясь подключиться к gmail с помощью TSL, я застрял на некоторых сообщениях об ошибках.Ниже приведен код:

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 = "cookie@gmail.com";
        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("cookie@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("cookie@gmail.com"));
        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() {}
}

Я получаю

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)

Не комментируя props.setProperty("mail.smtp.ssl.trust", "smtpserver"); меняет это на

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)

Кто-нибудь видел это раньше?

Редактировать:

Поговорим о том, как превратить 10-минутное руководство по копированию и вставке в головную боль на целый день.Я до сих пор не решил это, однако, я читал все больше и больше.По-видимому, мне нужно хранилище публичных подписей ssl для сравнения.Предполагается, что это будет путь по линии /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security.Используя sudo update-alternatives --config java, я указываю это на /usr/lib/jvm/java-6-sun/jre/bin/java, что, в свою очередь, указывает на эту папку, однако, существует также символическая ссылка /usr/lib/jvm/default-java, не затронутая этим, в настоящее время указывающая на java-6-openjdk, и если я загляну в эту папку, онаотсутствовали сертификаты безопасности.И именно это используется NetBeans.О, радость.

Следуя этой рекомендации, я выполнил sudo apt-get install libbcprov-java, которая дала мне мою папку безопасности в openjdk (после того, как я немного поработал с sun-jdk, что, вероятно, сейчасустановлен, но кто знает, где, поскольку он не отображается в /usr/lib/jvm/).

Это все еще вызывает ту же ошибку MSG.Поэтому я переместил все это в Windows, попытался скомпилировать, оказалось, что приведенный выше код не совсем работает (не имеет значения для нашей цели, поскольку нерабочие биты идут после бита SSL) (привет и спасибо за все неправильные учебникитам сейчас, какой беспорядок).Во всяком случае, наконец-то получилось что-то, работающее с этим решением (хотя в нем достаточно избыточности, и хотя это не TLS, а SSL, но эй, ...).В любом случае все работает нормально и плавно, так что вернемся к Ubuntu и ding dong, то же самое сообщение об ошибке, что и выше.Очевидно, выглядит как проблема, связанная с хранилищем ключей.Я все еще в растерянности относительно того, как это исправить (текущая ошибка - первая, упомянутая выше).

Ответы [ 7 ]

6 голосов
/ 27 сентября 2012

Потребовались дни, чтобы попробовать сотни идей в соответствии с keytool, truststore, cacerst и т. Д. Но, наконец, мне пришлось просто установить свойство mail.smtp.ssl.trust:

props.setProperty("mail.smtp.ssl.trust", "smtpserver");

3 голосов
/ 21 ноября 2012

Изменение

  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.starttls.enable", "true");

до

  props.put("mail.smtp.auth", true);
  props.put("mail.smtp.starttls.enable", true);

Тогда программа работает правильно

1 голос
/ 10 декабря 2011

Ну, получается, что Sun JDK только что установлен на JRE.Ницца.Так что мой java-6-sun-1.6.0.26 теперь jdk.Какой бы ни.Меня это устраивает.

В любом случае, переименование /usr/lib/jvm/default-java в мою недавно обновленную папку sun jdk переключает NetBeans с openjdk на sun-jdk и, ура, работает.

0 голосов
/ 07 января 2014

Неа!Согласно https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html и аналогичным значениям для imap.Все значения ДОЛЖНЫ быть указаны в виде строки (и это также «природа» свойств), например «123» для целого числа 123 или «истинное» для логического значения «истина».Исключение: javax.mail.MessagingException: java.security.NoSuchAlgorithmException: Ошибка реализации конструкции (алгоритм: по умолчанию, поставщик: SunJSSE, класс: sun.secu rity.ssl.SSLContextImpl $ DefaultSSLContext); основывается нанеподдерживаемый TLS на «старых» окнах, таких как Vista, XP (см. блог MS).Я распаковал пакет javax.mail.jar и проследил трассировку до строки, где он вызвал это странное исключение: он находится в источнике SocketFetcher.java (package com.sun.mail.util;) и точно в методе createSocket ()@ строка MailSSLSocketFactory msf = new MailSSLSocketFactory ();И когда я проверил этот MailSSLSocketFactory.java, он сказал:

    public MailSSLSocketFactory() throws GeneralSecurityException {
      this("TLS");
    }
0 голосов
/ 26 марта 2013

Наконец-то решено.Я перепробовал все, чтобы пройти аутентификацию на моем сервере обмена, но безуспешно.Используйте код ниже:

Properties props = (Properties)System.getProperties().clone();
props.put("mail.smtp.host", host);
props.setProperty("mail.smtp.port", "587");
props.put("mail.smtp.auth", true);

//Bypass the SSL authentication
props.put("mail.smtp.ssl.enable", false);
props.put("mail.smtp.starttls.enable", false);
0 голосов
/ 10 декабря 2011

Я недавно исправил ошибку в этой области, которая может быть связана с вашей проблемой.Попробуйте последнюю версию SNAPSHOT от здесь .

0 голосов
/ 09 декабря 2011

Я не видел его, но исключение говорит о том, что вы не поместили сертификат сервера smtp в ваш файл trustedca или этот файл недоступен

...