无法握手具有端口587和server =“smtp.gmail.com”的ssl套接字

时间:2018-01-18 11:01:06

标签: java ssl handshake sslhandshakeexception

此代码适用于 PORT = 465 。 但是对于PORT = 587,它会抛出异常“线程主javax.net.ssl.SSLException中的异常:无法识别的SSL消息,明文连接?

package smtpClient;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.naming.NamingException;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

class TLS_Mime_G {
    static final int PORT = 587;
    static String REMOTEHOST = "smtp.gmail.com";

    public static void main(String[] args)
            throws IOException, NoSuchAlgorithmException, NamingException, KeyManagementException {

        SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket socket = (SSLSocket) ssf.createSocket(REMOTEHOST, PORT);

        socket.setEnabledProtocols(socket.getSupportedProtocols());
        socket.setEnabledCipherSuites(socket.getSupportedCipherSuites());
        socket.addHandshakeCompletedListener(new MyTLSHandshakeListener());
        socket.startHandshake();//Throws Error 

        System.out.println("Connected to " + socket.getRemoteSocketAddress());

    }
}

class MyTLSHandshakeListener implements HandshakeCompletedListener {
    public void handshakeCompleted(HandshakeCompletedEvent e) {
        System.out.println("Handshake succesful!");
        System.out.println("Cipher suite used: " + e.getCipherSuite());

    }
}

/ * 支持的协议:SSLv2Hello 支持的协议:SSLv3 支持的协议:TLSv1 支持的协议:TLSv1.1 支持的协议:TLSv1.2 启用协议:TLSv1 启用的协议:TLSv1.1 启用的协议:TLSv1.2 * /

1 个答案:

答案 0 :(得分:0)

465是'隐含的'TLS-formerly-SSL;您在TCP级别连接,然后立即启动TLS连接,并且(如果成功)然后通过TLS(通过TCP)连接执行SMTP。

587是'明确的'TLS-formerly-SSL;您在TCP级别连接并通过读取服务器公告并至少执行EHLO命令和响应(以及可能/可选的其他)来开始执行SMTP,然后执行STARTTLS命令并检查响应,如果成功,则启动TLS连接现有的TCP连接和(如果成功)然后通过TLS over TCP连接执行SMTP。 Have a look at rfc 3207.

你的例外已经告诉过你了;它表示您已连接到尚未执行SSL / TLS但正在执行明文的服务器 - 在本例中为明文SMTP。

此外,启用所有受支持的版本和密码套件是一个非常糟糕的主意;默认情况下,其中许多都被禁用,因为它们不安全。尽管在这种特殊情况下SSLv3被POODLE(!)破坏了,但是没关系,因为gmail(非常正确)永远不会协商它; OTOH启用ECDH_anon_AES *等匿名套件允许主动攻击者轻松拦截,读取和/或更改您所谓的安全电子邮件。

或者只使用javamail,它已经实现了所有这些选项以及更多正确