【问题标题】:SSL with javamail not working带有 javamail 的 SSL 不起作用
【发布时间】:2012-01-16 23:04:38
【问题描述】:

尝试使用 TSL 连接到 gmail,我遇到了一些错误消息。给出以下代码:

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/java-6-sun/jre/bin/java 又指向该文件夹,但是,也存在一个不受此影响的/usr/lib/jvm/default-java 符号链接,当前指向java-6-openjdk,如果我查看该文件夹,它缺少安全证书。 NetBeans 正在使用它。哦,快乐。

按照this 的推荐,我做了sudo apt-get install libbcprov-java,它给了我在openjdk 中的安全文件夹(在与sun-jdk 混了一段时间之后,大概现在已经安装了,但是谁知道在哪里,因为它不在'没有出现在/usr/lib/jvm/)。

这仍然会产生相同的错误消息。因此我将它全部移到 Windows 上,尝试编译,结果发现上面的代码不能正常工作(对我们的目的无关紧要,因为非工作位在 SSL 位之后)(嘿,感谢所有不正确的教程到现在为止,真是一团糟)。无论如何,终于得到了使用 this 解决方案的东西(虽然那里有相当多的冗余,虽然它不是 TLS 而是 SSL,但是嘿,......)。在任何情况下,一切正常,顺利,所以回到 Ubuntu,叮咚,再次出现与上面相同的错误消息。显然看起来像是围绕 KeyStore 的问题。我仍然不知道如何修复它(当前错误是上面提到的第一个错误)。

【问题讨论】:

  • 注意:即使您使用 SMTPS(即 SMTP 在单独的端口上使用 SSL/TLS,而不是在同一端口上使用 STARTTLS 的 SMTP),您也可能在使用 TLS(即 SSL 的继任者,在 IETF 内)。这不是 SSL 和 TLS 之间的区别。 (出于某种原因,您使用的不同之处在于 MS Outlook 等某些工具使用的不同,但它不正确。)

标签: java ssl smtp gmail jakarta-mail


【解决方案1】:

我还没有看到它,但异常告诉您没有将 smtp 服务器证书放入您的 trustedca 文件或此文件不可用

【讨论】:

  • 是的,这就是为什么...我认为我不需要这样做,毕竟电子邮件客户端似乎可以立即工作...我该怎么做?
  • 嗯,这很容易,但你必须明白,你在做什么。查看keytool doc:docs.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html 思路是通过keytool cmd 将证书导入到$JRE_HOME\lib\security\cacerts 文件中
【解决方案2】:

我最近修复了这方面的一个错误,它可能与您的问题有关。从here 尝试最新的 SNAPSHOT 版本。

【讨论】:

  • 您能否更具体地说明一下这个错误是关于什么的?
  • 这与需要服务器身份检查时如何处理 SSL 协议有关。旧代码适用于某些服务器,但不适用于其他服务器。固定版本更正确。但听起来你的问题毕竟出在证书上,Ubuntu 安装 JDK 的方式很复杂。您可能还对有关证书的 JavaMail FAQ 条目感兴趣。
  • JavaMail FAQ entry about certificates有死链接,详情请查看here
【解决方案3】:

嗯,原来sun jdk刚刚安装在jre之上。好的。所以我的 java-6-sun-1.6.0.26 现在是一个 jdk。任何。适合我。

无论如何,将 /usr/lib/jvm/default-java 重新指向我新升级的 sun jdk 文件夹会将 NetBeans 从 openjdk 切换到 sun-jdk 并且它正在工作。

【讨论】:

    【解决方案4】:

    根据 keytool、truststore、cacerst 等,尝试数百个想法需要几天时间。 但最后我不得不简单地设置 mail.smtp.ssl.trust 属性:

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

    【讨论】:

    • 这只是关闭了绕过安全层的主机的证书检查。这不是问题的真正解决方案...
    【解决方案5】:

    改变

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

    然后程序运行正常

    【讨论】:

    【解决方案6】:

    终于解决了。我尝试了一切以在我的交换服务器上进行身份验证,但没有成功。使用下面的代码:

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

    【讨论】:

    • 关闭 SSL 并不能解决 SSL 相关问题!
    【解决方案7】:

    不! 根据https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html 和类似的 imap 值。 所有值都必须作为字符串给出(它也是属性的“性质”),例如“123”表示 int 123 或“true”表示布尔真。 例外: javax.mail.MessagingException: java.security.NoSuchAlgorithmException: 错误 构造实现(算法:默认,提供者:SunJSSE,类:sun.secu rity.ssl.SSLContextImpl$DefaultSSLContext); 基于 vista、XP 等“旧”窗口上不受支持的 TLS(参见 MS 博客)。 我解开包 javax.mail.jar 并跟踪跟踪到它导致这个奇怪异常的行:它在源 SocketFetcher.java (包 com.sun.mail.util;)中,并且正好在方法 createSocket() @线 MailSSLSocketFactory msf = new MailSSLSocketFactory(); 当我检查这个 MailSSLSocketFactory.java 它说:

        public MailSSLSocketFactory() throws GeneralSecurityException {
          this("TLS");
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多