首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSLHandshakeException:握手过程中远程主机关闭连接

SSLHandshakeException:握手过程中远程主机关闭连接
EN

Stack Overflow用户
提问于 2015-03-30 15:06:59
回答 4查看 7.5K关注 0票数 3

我有以下方法可以使用imap从Gmail中检索消息

代码语言:javascript
复制
public static void main(String[] args)
    {
        Properties props = new Properties();
        try
        {
            props.load(new FileInputStream(new File("smtp.properties")));
            Session session = Session.getDefaultInstance(props, null);

            Store store = session.getStore("imaps");
            store.connect("smtp.gmail.com", "******@gmail.com", "mypass");

            Folder inbox = store.getFolder("inbox");
            inbox.open(Folder.READ_ONLY);
            int messageCount = inbox.getMessageCount();

            Message[] messages = inbox.getMessages();
            System.out.println("------------------------------");
            for (int i = 0; i < 10; i++)
            {
                System.out.println("Mail Subject:- " + messages[i].getSubject());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

我的smtp.properties包含

代码语言:javascript
复制
 mail.smtp.host=smtp.gmail.com
 mail.smtp.socketFactory.port=465
 mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
 mail.smtp.auth=true
 mail.smtp.port=465

当我运行这个程序时,我得到了以下信息

代码语言:javascript
复制
javax.mail.MessagingException: Remote host closed connection during handshake;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:695)
    at javax.mail.Service.connect(Service.java:345)
    at javax.mail.Service.connect(Service.java:226)
    at gmailsmpt.Main.main(Main.java:25)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:532)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:337)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
    at com.sun.mail.iap.Protocol.<init>(Protocol.java:116)
    at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:121)
    at com.sun.mail.imap.IMAPStore.newIMAPProtocol(IMAPStore.java:710)
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:659)
    ... 3 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
    at sun.security.ssl.InputRecord.read(Unknown Source)
    ... 14 more

我如何解决这个问题?

EN

回答 4

Stack Overflow用户

发布于 2015-03-31 02:52:36

首先,清理所有这些common mistakes。您不需要任何套接字工厂。

然后试试这些connection debugging tips

可能您有防火墙或防病毒程序阻止您连接。

票数 1
EN

Stack Overflow用户

发布于 2021-11-09 16:01:16

问题是JavaTLS1.0中的默认jre1.8.0_141版本,但是由于1.0中的漏洞,许多电子邮件服务器不再接受连接。为了在代码中直接使用1.2,在创建发送邮件的属性时,这条指令对我很有效:

代码语言:javascript
复制
props.put("mail.smtp.ssl.protocols", "TLSv1.2");

例如:

代码语言:javascript
复制
Properties props = System.getProperties();
props.put("mail.smtp.host", mailHost);
props.put("mail.smtps.auth", mailAuth);
props.put("mail.transport.protocol", mailProtocol);
props.put("mail.smtp.ssl.protocols", "TLSv1.2");

// Get a Session object
Session sess = Session.getInstance(props, null);

// construct the message
MimeMessage msg = new MimeMessage(sess);
msg.setFrom(new InternetAddress(mailUser));

还要注意,您可以只在try块开始处加载的属性文件(smtp.properties)中设置相同的属性。

票数 1
EN

Stack Overflow用户

发布于 2015-03-30 15:51:26

还有更多的堆栈跟踪吗?较早的Java版本在与超过1024位的RSA密钥的TLS握手方面存在问题(也可能与具有确切位字节的密钥有关)。

此问题已在Java 1.7或Java 1.8中修复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29340221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档